いつもお世話になっております。
XMLの動作についての質問です。以下のようなXMLファイルがあったとします。それに対して、その下のようなXSLファイルがあり、変換させると、結果XMLができます。
そこでわからないのは、test.xslの中ほどで、<xsl:template match="book/title/price">という風にXPath式でbook/title/priceと指定しているのに、結果には<title>の値も出力されます。なぜでしょうか。
自分のイメージとしては、<title>の値は出力されず<price>の値だけが出力されるのじゃないのかなっていう感じです。さらに<newTag>に<title>の値が挟まれていないのもなぜなのかわかりません。
お分かりになる方よろしくお願いします。もし参考文献に良いサイトや本がありましたらそちらも紹介をお願いします。
<<<test.xml>>>
<?xml version="1.0" encoding="Shift_JIS"?>
<books>
<book>
<title>
XMLとは
<price>2000</price>
</title>
</book>
<book>
<title>
XML概論
<price>1800</price>
</title>
</book>
<book>
<title>
XMLマスター
<price>4000</price>
</title>
</book>
</books>
<<<test.xsl>>>
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<answer>
<xsl:apply-templates select="books/book"/>
</answer>
</xsl:template>
<xsl:template match="book/title/price">
<newTag>
<xsl:value-of select="."/>
</newTag>
</xsl:template>
</xsl:stylesheet>
<<<結果.xml>>>
<?xml version="1.0" encoding="utf-8" ?>
<answer>
XMLとは
<newTag>2000</newTag>
XML概論
<newTag>1800</newTag>
XMLマスター
<newTag>4000</newTag>
</answer>
No.1ベストアンサー
- 回答日時:
うん。
誤解しまくっているね。まずは「ビルトインテンプレート」について学ぼう。
http://okwave.jp/qa3362718.html #2リンク先
apply-templatesでselectしているのは
複数のbook要素ノードからなるノードセットだね。
<xsl:apply-templates select="books/book"/>
最初のbook要素はprice要素じゃないから
以下のテンプレートにマッチしない
<xsl:template match="book/title/price">
よってビルトインテンプレートを適用する。
book要素の最初の子は(空白文字類からなる)テキストノード。これはそのまま。
次にtitle要素。だけどこれもprice要素じゃないからやっぱりテンプレートにマッチしない
よってtitle要素にもビルトインテンプレートを適用する
title要素の最初の子はテキストノードだからそのまま出力。
●XMLとは
title要素の次の要素はprice要素。ここでやっと,テンプレートにマッチするから適用していく。
テキストノード
●
newTag要素開始タグ
●<newTag>
テキストノード
●
と続いて・・・
xsl:value-of要素のselectはマッチしているprice要素を基準に考えられるからprice要素そのもの。
xsl:value-of要素が出力する内容は
http://www.w3.org/TR/xslt#value-of
に従いstring関数にオブジェクトを指定した(string-value)のと同じ内容の文字列。
http://www.w3.org/TR/xpath#function-string
http://www.w3.org/TR/xpath#element-nodes
Element Nodeのstring-valueはその要素の子のstring-valueを全てつなげたもの。
price要素の子はテキストノードだけで,それはそのテキストノードの文字列そのものである。
http://www.w3.org/TR/xpath#section-Text-Nodes
●2000
テキストノード
●
newTag終了タグ
●</newTag>
テキストノード
●
テンプレートおしまい。
次の要素はprice要素の次のノードだからテキストノード。
●
でtitle要素への適用終わり。
title要素の次はやっぱりテキストノード
●
book要素への適用終わり。
テンプレートをbooks要素の子の次(二番目の)のbook要素に適用する。
この前のテキストノードはselectしてないから当然選ばれない。
・・・・(以下略)
だから出力結果は正しいです。
======================
これがもし,
<xsl:apply-templates select="books/book"/>
ではなく
<xsl:apply-templates select="books/book/title/price"/>
だったら、出力結果は
<?xml version="1.0" encoding="utf-8"?>
<answer>
<newTag>2000</newTag>
<newTag>1800</newTag>
<newTag>4000</newTag>
</answer>
となります。
========================
ところで,多分サンプルの都合だと思うけど
普通はこういう構造にするよね・・・・
<?xml version="1.0" encoding="Shift_JIS"?>
<books>
<book>
<title>XMLとは</title>
<price>2000</price>
</book>
</books>
#よく調べてないけど改行とかは無視されるのかも。
xml:spaceとか使うのかなあ?
この回答への補足
回答ありがとうございます。
現在ある試験用の本を読んで勉強しているのですが、おはずかしながら全く分かっていないですね(汗)最初のリンク先で紹介されているXML関連のサイトの方が詳しいような気がしたり・・・。この先が心配です。
でして、現在リンク先のサイトを見ていますので、ある程度見終わったら改めてお礼の方を書かさせていただきたいと思います。
もう少しお待ちください。
回答ありがとうございました。
回答に書いてあることが理解できました。
この調子だとまたこちらで投稿させていただくことになりそうです。その時にはまたよろしくお願いします。(この先が不安だ・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 関係代名詞の文章なのですが、 I bought a book the title of which 3 2023/05/27 19:40
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- WordPress(ワードプレス) ワードプレスにて .xmlファイルの使い方をご存知の方、よろしくお願いいたします。 2 2022/09/30 00:55
- PHP PHPプログラムの間違い 1 2022/10/06 14:33
- HTML・CSS 疑似要素で背景画像に指定したSVG画像の色変更 2 2023/01/30 22:45
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- XML iPhoneでXMLファイルを開くにはどうしたら良いのでしょうか? 1 2022/09/05 18:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Listからのnull要素を削除方法は?
-
getElementsByNameの要素数が取...
-
CPUの考え方を教えてください ...
-
XMLで要素が記述された順番に意...
-
バッチファイルでテキストファ...
-
昔Winnyってありましたけど、あ...
-
あせんうぶり言語
-
XSLで、XMLの空タグを制御したい。
-
VB6でXMLを作成しているのです...
-
SNMP リンクダウンとノードダ...
-
あるノードリストに、特定の名...
-
HTTPステータス 404 - There is...
-
コンテキストメニュークリック...
-
ノードの並び替え
-
ルート要素ノードが2個ある場合?
-
ノードとは
-
このエラー、何とかなりません...
-
html→xmlの変換
-
xmlファイルが上手にHTMLに変換...
-
Excel-VBAでXMLの複数ノードの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大規模行列の計算
-
XML:連番要素の全ての子要素にx...
-
MFCでのタブコントロールに...
-
フロートってなに?
-
element of surprise
-
hana no namae osiete kudasai.
-
VB2005でXMLデータから複数ある...
-
svgをhtmlに埋め込んで使いたい
-
getElementsByNameの要素数が取...
-
動的にメモリを確保した配列の...
-
Webページに関するさまざまな情...
-
cssで外部ファイルを読み込む
-
Listからのnull要素を削除方法は?
-
ASP.NETでツリービューを作成し...
-
HPビルダー2001で選んで流す。
-
どうあがいてもIE6のエンコード...
-
XMLはなぜ普及したのか?
-
XSLTの記述方法
-
HTMLでol、liで作成した長...
-
2つの行動の違い
おすすめ情報