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

解決済みの質問

XSLTの動作

いつもお世話になります。
以下のXSLTの処理の動き方を教えてください。
どうして3の結果xmlになるのかわかりません。おそらくposition()の取り方がわかっていないのかなって思っています。
自分としては
<answer>
 <色>白</色>
 <色>yellow</色>
 <色>赤</色>
 <色>blue</色>
 <色>黒</色>
</answer>
になるんじゃないのかなって思ってしまうのですが・・・。



(1)データ
<?xml version="1.0" encoding="Shift_JIS"?>
<color_pencil>
 <price>1300</price>
 <color><en>white</en><jp>白</jp>
 <color><en>yellow</en><jp>黄色</jp>
 <color><en>red</en><jp>赤</jp>
 <color><en>blue</en><jp>青</jp>
 <color><en>black</en><jp>黒</jp>
</color_pencil>

(2)XSLT
<?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>
  <for-each select="color_pencil/color">
   <xsl:choose>
    <xsl:when test="position() mod 2=0">
     <xsl:apply-templates select="." />
    </xsl:when>
    <xsl:otherwise>
     <xsl:call-template name="color" />
    </xsl:otherwise>
   </xsl:choose>
  </xsl:for-each>
 </answer>
</xsl:template>
 <xsl:template match="color">
  <色><xsl:value-of select="jp" /></色>
 </xsl:template>
 <xsl:template name="color">
  <色><xsl:value-of select="en" /></色>
 <xsl:template>
</xsl:stylesheet>

(3)結果xml
<answer>
 <色>white</色>
 <色>黄色</色>
 <色>red</色>
 <色>青</色>
 <色>black</色>
</answer>

投稿日時 - 2008-05-01 09:05:50

QNo.3989224

すぐに回答ほしいです

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

(1)つまり、<color>要素の兄弟でループしているという考え方でよいのでしょうか?

OK

(2)
><xsl:apply-templates select="." />で呼ばれるのは、<xsl:template match="color">であると思うのですが、
OK

><xsl:value-of select="jp" />で<jp>要素はよばれるが、
NG
呼ばれるけどjp要素に対して【templateを】適用しろ、とは言って無いし,value-of select自体はテンプレートでもなんでもないよね?

><en>はビルトインテンプレートが呼ばれるのではないのでしょうか??
NG
これがもし,

<xsl:when test="position() mod 2=0">
  <xsl:apply-templates />
</xsl:when>

だったら,
http://www.w3.org/TR/xslt#section-Applying-Template-Rules
>In the absence of a select attribute, the xsl:apply-templates instruction processes all of the children of the current node, including text nodes.
select属性がないので全ての子要素に対して該当するテンプレートを探して適用しますがね。
=============
細かいことだけど,俺前回間違ったことを教えているところがあった。
http://www.w3.org/TR/xslt#strip

投稿日時 - 2008-05-01 21:43:37

補足

回答ありがとうございます。

(1)
<xsl:template match="color">
 <色><xsl:value-of select="jp" /></色>
</xsl:template>
において、、<color><en>yellow</en><jp>黄色</jp></color>がカレントノードとして渡され、<color>→<en>→<jp>とカレントノードが移動していき、その中で<jp>が適合するので黄色が吐き出されるということで良いのでしょうか?
ただ、<xsl:call-template name="color" />においては
<xsl:template name="color">
 <色><xsl:value-of select="en" /></色>
<xsl:template>
を呼び出してもカレントノードが移動しないが、<color><en>white</en><jp>白</jp></color>において<color>の子要素に<en>があるのでwhiteが吐き出される。
しかし、<xsl:call-template name="color" />に処理が戻っていっても、そっちの方には<en>や<jp>に適合するテンプレート呼び出しとかもないので、他に何かを吐き出すということも無いということでよろしいのでしょうか?

(2)
前回間違ったことを教えていたとありますが、リンク先が英語で・・・なんのことやら・・・という感じですが空白文字の削除の仕方について書いてあると思うのですが、何が間違っていたのかも(汗)

投稿日時 - 2008-05-02 07:16:43

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

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

回答(2)

まず三つ関係ないところを指摘しておく。
1. color要素終了タグが悉く抜けている
2. for-each要素開始タグから名前空間接頭辞が抜け落ちている。
3. 開始タグ<xsl:template name="color">に対する終了タグから/が抜け落ちている。

さて,本題に入ろうか。
過去の質問を見ていると受けようとしている試験はそれなりのもののようだし,回答履歴見てもVB.NETやC#やらの回答をしている以上,

「zero origin」って聞いたことあるよね?
配列の添え字みたいに0から始まるの。1個の要素からなる配列の最大添え字は0

逆にCountとかLengthみたいなのは
1個あったら1が返ってくるよね?

position関数がどっちなのか,前回でもそうだったけど【困った時は規格を調べる】のが一番だ。

http://www.w3.org/TR/xpath#section-Node-Set-Functions
>The position function returns a number equal to the context position from the expression evaluation context.

position関数はexpressionが評価されたコンテキストにおける位置を返す。

でcontext positionってなによ、ってリンク張ってあるからたどってみると
http://www.w3.org/TR/xpath#dt-context-position
>a pair of non-zero positive integers (the context position and the context size)
【非ゼロの】整数の組み合わせ(context positionとcontext size)
って書いてあるからpositionは1から始まる。
<color><en>white</en><jp>白</jp></color>

position = 1
なので,
<xsl:otherwise>
<xsl:call-template name="color" />
</xsl:otherwise>
を適用するから
whiteが出てくるわけ

参考:
http://www.w3.org/TR/xslt#for-each

投稿日時 - 2008-05-01 09:48:16

補足

いつも回答ありがとうございます。
よくわかっていないところがぼろぼろと出てきます(汗)
(1)
ご説明より思ったのですが、<xsl:for-each select="color_pencil/color">でループするのは、
一回目は、<color><en>white</en><jp>白</jp></color>
二回目は、<color><en>yellow</en><jp>黄色</jp></color>
ということで良いのでしょうか?
つまり、<color>要素の兄弟でループしているという考え方でよいのでしょうか?

(2)
(1)の考え方で良いとすれば、<xsl:apply-templates select="." />で呼ばれるのは、<xsl:template match="color">であると思うのですが、<xsl:value-of select="jp" />で<jp>要素はよばれるが、<en>はビルトインテンプレートが呼ばれるのではないのでしょうか??

もう少しお付き合いよろしくお願いします。

投稿日時 - 2008-05-01 21:10:17

あなたにオススメの質問