いつもお世話になっております。
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ランキング
-
ASP.NETでツリービューを作成し...
-
Listからのnull要素を削除方法は?
-
東芝のDynabookなのですがアン...
-
コンテキストメニュークリック...
-
特殊記号が勝手にエスケープさ...
-
<xsl:key>とtopreceding-siblin...
-
UTF-8でエンコーディングとはど...
-
SNMP リンクダウンとノードダ...
-
【アプリ開発】日本語を含むXML...
-
Visual Basic .NET の識別子は...
-
ツリービューを閉じさせたくない。
-
C言語:文字列の並び替え
-
複数のxmlファイルの合体
-
XSLTでの正規表現判定
-
XML、XSLTの適応エラー(IEから...
-
XMLで要素が記述された順番に意...
-
XMLで特殊文字を扱うにはどうし...
-
Access VBAでXMLが読み込めない
-
translateの応用?文字の置換
-
Math.sqrt(Math.pow(canvas.wid...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
head要素
-
2つの行動の違い
-
Webページに関するさまざまな情...
-
getElementsByNameの要素数が取...
-
ASP.NETでツリービューを作成し...
-
使用しない要素を無視するには...
-
DOMでの要素名の変更
-
Listからのnull要素を削除方法は?
-
■XSLT■複数のノードを違う属性...
-
MFCでのタブコントロールに...
-
svgをhtmlに埋め込んで使いたい
-
hana no namae osiete kudasai.
-
element of surprise
-
XML:連番要素の全ての子要素にx...
-
VB2005でXMLデータから複数ある...
-
cssで外部ファイルを読み込む
-
XSLTの処理について
-
大規模行列の計算
-
次の要素の値取得
-
フロートってなに?
おすすめ情報