• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:XSLTの動作)

XSLTの処理の動き方と結果xmlになる理由とは?

このQ&Aのポイント
  • XSLTの処理の動き方を教えてください。position()の取り方が関係しているのかもしれません。
  • XSLTの処理で指定されたcolor_pencil要素の下のcolor要素を取得し、偶数番目の要素は英語表記、奇数番目の要素は日本語表記でanswer要素に表示されます。
  • <answer>要素にはcolor_pencil要素の下のcolor要素が表示され、偶数番目の要素は英語表記、奇数番目の要素は日本語表記です。

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

  • ベストアンサー
回答No.2

(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

ape5
質問者

補足

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

その他の回答 (1)

回答No.1

まず三つ関係ないところを指摘しておく。 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

ape5
質問者

補足

いつも回答ありがとうございます。 よくわかっていないところがぼろぼろと出てきます(汗) (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>はビルトインテンプレートが呼ばれるのではないのでしょうか?? もう少しお付き合いよろしくお願いします。

関連するQ&A

専門家に質問してみよう