こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

XSLT

いつもお世話になっております。
次の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>

(結果)
会議室

投稿日時 - 2008-05-08 08:22:15

QNo.4006015

すぐに回答ほしいです

質問者が選んだベストアンサー

>「会議室」を書き出して、次の処理は下の処理に移動するが次には何もないので、「会議室」しか書き出されないのが答えなのかな

違います。
会議室から次の場所へ処理を飛ばすには、
<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”と併せて入門書や入門サイトをご覧になられたほうが早いかもしれません。

投稿日時 - 2008-05-16 10:15:46

お礼

回答ありがとうございます。
問題の内容は問題集に書かれているとおりに書いたのですが、こっちの書き方がより良いですよという指摘、ありがたいです。
XSLTでの処理の流れ、わかりました。

入門書や入門サイトでよいところがありましたら、ご紹介いただけると助かります。個人的に読んでみた方がいいのかなとおもっているのが、
オライリーの入門XML
http://www.amazon.co.jp/%E5%85%A5%E9%96%80XML-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%EF%BC%B4%E3%83%BB%E3%83%AC%E3%82%A4/dp/4873111846/ref=sr_1_9?ie=UTF8&s=books&qid=1210909026&sr=1-9

なんですが、評価を見ると練習問題というものがないような感じのことを書かれていると思うのです。自分としては、理論的な説明があって、それの理解度を高めるために練習問題があり、それの解説がきちんとかいてあるというのが自分にあっていると思うので、どうしようかなと思っているところがあります。

よろしければ、お願いします。

投稿日時 - 2008-05-16 12:42:27

ANo.2

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

オライリー系は書き方が難しくて嫌いです・・。
オライリーのXMLSchemaの本買いましたが、1/10読んで力尽きた経験があります。

本は、Webで調べることができるだけの基礎知識をつけるためのものと考えているので、私は本ではXML逆引きクイックリファレンス(練習問題はありませんが、どれも使用例付きです。)というすごーく簡単な書籍で全体像を掴んで、その後はWebで適当に調べてます。
(つまり入門は本で、その後はWebという感じですね。)

投稿日時 - 2008-05-17 21:33:11

お礼

何度もお付き合いくださりありがとうございます。
オライリーはむずかしいですか。
アマゾンあたりで、色々眺めながら、探してみたいと思います。
紹介された本も調べてみたいと思います。
ありがとうございました。

投稿日時 - 2008-05-18 11:38:09

ANo.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を使えばいいってことです。

投稿日時 - 2008-05-09 06:06:15

補足

回答ありがとうございます。
お返事遅れまして大変もうしわけございません。
回答いただいた内容はわかりました。ただ、自分の質問の仕方が悪かったため、おおざっぱ過ぎたため自分の考えていたこととはずれた内容となっているようです。
自分が何を考えているかといいますと、まず、回答の2点に注目しています。
1.処理結果が「会議室」
2.解説に書いてあった、「処理は必ずルートノードのテンプレートから始まります」
です。
会議室というテキストノードは、/Conference/Roomにしかないのでここしか吐き出されない。だが、XSLTを見てみるとテキストノードを書き出すところが3か所ある。でも一か所しか処理されていない。
また、XMLインスタンスの方では、/Conference/Roomの方がpositionは先であり、NumberやDateは後方である。

ここまで至って自分のなかでは、処理の順番はXMLインスタンスのノードの順番ではなく、XSLTの処理の順番である。で、プログラミングをされている方なら、次の感覚が分かってもらえると思うのですが、「処理は通常上から順番に行われるのが基本である」という考えを適用すると、解説の、「処理は必ずルートノードのテンプレートから始まります」を実行するといきなり最初にXSLTの最後のブロックに飛んで、「会議室」を書き出して、次の処理は下の処理に移動するが次には何もないので、「会議室」しか書き出されないのが答えなのかなと考えているのですが、これが正しいのかどうかという自信がなく質問させていただきました。
もしよろしければ、これについての回答をお願いします。

投稿日時 - 2008-05-15 19:42:18

あなたにオススメの質問