いつもお世話になっております。
次のXSLTの結果がどうしてそうなるのかわからないので教えてください。
解説には、「処理は必ずルートノードのテンプレートから始まります」と書いてあるんですが、できましたら、その辺もからめて、どういう処理の流れになるのか、カレントノードがどう移動していくのか、教えていただけると助かります。
(XML)
<?xml version="1.0" encoding="Shift_JIS"?>
<Conference Situation="Reserved" Equipment="Projector">
<Room>会議室</Room>
<User>山田太郎
<Date>2008/05/08</Date>
<Time>10:00-12:00</Time>
</User>
<Number>4名</Number>
</Conference>
(XSLT)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/Conference">
<xsl:value-of select="Number" />
</xsl:template>
<xsl:template match="Conference/User">
<xsl:value-of select="Date" />
</xsl:template>
<xsl:template match="/">
<xsl:value-of select="Conference/Room" />
</xsl:template>
</xsl:stylesheet>
(結果)
会議室
No.2ベストアンサー
- 回答日時:
>「会議室」を書き出して、次の処理は下の処理に移動するが次には何もないので、「会議室」しか書き出されないのが答えなのかな
違います。
会議室から次の場所へ処理を飛ばすには、
<xsl:apply-templates />
のように、次の場所に飛ぶ命令をしなくてはいけません。
<xsl:template match="/">
<xsl:value-of select="Conference/Room" />
</xsl:template>
これでは、Conference/Roomの“会議室”という値を書き出したところで処理が止まってしまいます。
ちなみに、<xsl:value-of select="Conference/Room" />よりも
<xsl:value-of select="." />
のほうが適当ですが、
下記の通りなので、詳しい説明は控えます。
根本的に、基礎的に質問者さんの認識はずれているので、質問と回答という形では、認識の矯正は難しいように感じます。
“XPath”と併せて入門書や入門サイトをご覧になられたほうが早いかもしれません。
回答ありがとうございます。
問題の内容は問題集に書かれているとおりに書いたのですが、こっちの書き方がより良いですよという指摘、ありがたいです。
XSLTでの処理の流れ、わかりました。
入門書や入門サイトでよいところがありましたら、ご紹介いただけると助かります。個人的に読んでみた方がいいのかなとおもっているのが、
オライリーの入門XML
http://www.amazon.co.jp/%E5%85%A5%E9%96%80XML-%E …
なんですが、評価を見ると練習問題というものがないような感じのことを書かれていると思うのです。自分としては、理論的な説明があって、それの理解度を高めるために練習問題があり、それの解説がきちんとかいてあるというのが自分にあっていると思うので、どうしようかなと思っているところがあります。
よろしければ、お願いします。
No.3
- 回答日時:
オライリー系は書き方が難しくて嫌いです・・。
オライリーのXMLSchemaの本買いましたが、1/10読んで力尽きた経験があります。
本は、Webで調べることができるだけの基礎知識をつけるためのものと考えているので、私は本ではXML逆引きクイックリファレンス(練習問題はありませんが、どれも使用例付きです。)というすごーく簡単な書籍で全体像を掴んで、その後はWebで適当に調べてます。
(つまり入門は本で、その後はWebという感じですね。)
何度もお付き合いくださりありがとうございます。
オライリーはむずかしいですか。
アマゾンあたりで、色々眺めながら、探してみたいと思います。
紹介された本も調べてみたいと思います。
ありがとうございました。
No.1
- 回答日時:
ルートノードを処理しているのが
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
の部分です。
xsl:apply-templatesは、ルートノードの中の、「次にマッチするノードを探しにいきなさい」という命令です。
ここから、Room、User、Numberのテンプレートにたどり着きます。
test.xslファイル
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="Room">
部屋:<xsl:value-of select="." /><br />
</xsl:template>
<xsl:template match="Number">
人数:<xsl:value-of select="." /><br />
</xsl:template>
<xsl:template match="User">
ユーザ:<xsl:value-of select="." /><br />
<xsl:apply-templates />
</xsl:template>
<xsl:template match="Date">
日付:<xsl:value-of select="." /><br />
</xsl:template>
<xsl:template match="Time">
時間:<xsl:value-of select="." /><br />
</xsl:template>
</xsl:stylesheet>
test.xmlファイル
<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<Conference Situation="Reserved" Equipment="Projector">
<Room>会議室</Room>
<User>山田太郎
<Date>2008/05/08</Date>
<Time>10:00-12:00</Time>
</User>
<Number>4名</Number>
</Conference>
結果
部屋:会議室
ユーザ:山田太郎 2008/05/08 10:00-12:00
山田太郎 日付:2008/05/08
時間:10:00-12:00
人数:4名
ブラウザで見ると確認できます。
おせっかいですが、
<User>山田太郎
<Date>2008/05/08</Date>
<Time>10:00-12:00</Time>
</User>
よりも、
<User>山田太郎</User>
<Date>2008/05/08</Date>
<Time>10:00-12:00</Time>
のほうが、わかりやすさも、処理のしやすさからも、いいと思います。
投げやりになりましたが、カレントノードを移動しながら処理を進めるには、xsl:apply-templatesを使えばいいってことです。
この回答への補足
回答ありがとうございます。
お返事遅れまして大変もうしわけございません。
回答いただいた内容はわかりました。ただ、自分の質問の仕方が悪かったため、おおざっぱ過ぎたため自分の考えていたこととはずれた内容となっているようです。
自分が何を考えているかといいますと、まず、回答の2点に注目しています。
1.処理結果が「会議室」
2.解説に書いてあった、「処理は必ずルートノードのテンプレートから始まります」
です。
会議室というテキストノードは、/Conference/Roomにしかないのでここしか吐き出されない。だが、XSLTを見てみるとテキストノードを書き出すところが3か所ある。でも一か所しか処理されていない。
また、XMLインスタンスの方では、/Conference/Roomの方がpositionは先であり、NumberやDateは後方である。
ここまで至って自分のなかでは、処理の順番はXMLインスタンスのノードの順番ではなく、XSLTの処理の順番である。で、プログラミングをされている方なら、次の感覚が分かってもらえると思うのですが、「処理は通常上から順番に行われるのが基本である」という考えを適用すると、解説の、「処理は必ずルートノードのテンプレートから始まります」を実行するといきなり最初にXSLTの最後のブロックに飛んで、「会議室」を書き出して、次の処理は下の処理に移動するが次には何もないので、「会議室」しか書き出されないのが答えなのかなと考えているのですが、これが正しいのかどうかという自信がなく質問させていただきました。
もしよろしければ、これについての回答をお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 英語 "an amount of"の意味等について 2 2023/06/13 12:19
- JavaScript Json のキーと値の出力の違いについて 2 2022/06/14 20:22
- 英語 提示した名言の文の構造について(waste one hour of time) 5 2023/05/20 15:22
- Visual Basic(VBA) シートを選択して、1つのPDFにしたいのですが。 5 2022/10/03 20:18
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- 数学 イギリスで数学の学会発表をしたいです。 7 2023/03/26 21:46
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XSL中の改行、タブを無効にした...
-
google croud にあるファイルを...
-
昔Winnyってありましたけど、あ...
-
VBSでxmlの値を書き換えたい
-
東芝のDynabookなのですがアン...
-
TreeViewに重複する値をセット
-
コンテキストメニュークリック...
-
UTF-8でエンコーディングとはど...
-
xmlファイルが上手にHTMLに変換...
-
各ノードの行数取得
-
2分探索木の高さを求めるプロ...
-
TreeViewの再表示のちらつきを...
-
VB6でXMLを作成しているのです...
-
SNMP リンクダウンとノードダ...
-
C#初心者です。HtmlAgilityPack...
-
VB6.0 特殊文字コードの変換
-
ノードとは
-
Excel-VBAでXMLの複数ノードの...
-
このエラー、何とかなりません...
-
VBAでXMLを出力するプログラム...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
タグの有無の判定
-
XSLで、XMLの空タグを制御したい。
-
スタイルシートを使用したXM...
-
XMLのHTMLへの変換 (初心者)
-
ノードの並び替え
-
xmlのテキストにリンクを張りた...
-
XSL内でJavaScriptを記述し、Ja...
-
xml→htmlへの変換&ページ分割...
-
XSLTにてタグ名を取得する方法
-
空かスペースを認識させること...
-
XSL中の改行、タブを無効にした...
-
XMLとXSLTでリンクを張る方法
-
xslでの最小値、最大値の取得
-
重複するものを消したい
-
スタイルシートについて
-
javaのTransformerでエラー
-
■XSLT■固定文字を使ったループ...
-
for-eachが上手くいきません
-
XMLデータを動的に使用する
-
XSLT
おすすめ情報