![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
いつもお世話になります。
以下の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>
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-Templ …
>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
この回答への補足
回答ありがとうございます。
(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)
前回間違ったことを教えていたとありますが、リンク先が英語で・・・なんのことやら・・・という感じですが空白文字の削除の仕方について書いてあると思うのですが、何が間違っていたのかも(汗)
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-Func …
>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
この回答への補足
いつも回答ありがとうございます。
よくわかっていないところがぼろぼろと出てきます(汗)
(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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS htmltとcssのコードで 1 2022/11/26 13:37
- CPU・メモリ・マザーボード これは、黒はすこし怖いと思いますか? 4 2022/12/15 15:56
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- 洋画 HK243 S SAR には色が黒の奴はあるのでしょうか? HK243 の “SAR” (Semi- 1 2022/08/26 08:09
- HTML・CSS HTMLで特定の文字だけ色を変えたいのですが、指定した色と違う色が反映してしまいます。 下記、「前」 5 2023/06/27 12:08
- HTML・CSS cssの display: flex;で横並びにならずに困ってます 1 2022/12/04 13:18
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- レディース これは、黒と白はどちらが合うと思いますか? 3 2022/12/15 15:44
- Visual Basic(VBA) ダブルクリックでセルの色を変える 1 2022/12/24 15:52
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
重複するものを消したい
-
htmlに変換されない
-
XSL内でJavaScriptを記述し、Ja...
-
XSLTの動作
-
あせんうぶり言語
-
東芝のDynabookなのですがアン...
-
ASP.NETでツリービューを作成し...
-
XMLファイルの作り方がわかりま...
-
UTF-8でエンコーディングとはど...
-
昔Winnyってありましたけど、あ...
-
特殊記号が勝手にエスケープさ...
-
ノード数とは?
-
xmlファイルが上手にHTMLに変換...
-
バッチファイルでテキストファ...
-
VBSでXMLを読込、検索結果をテ...
-
縁切りするとき
-
XML、XSLTの適応エラー(IEから...
-
ノベルゲームを作る場合、
-
XML表示を2段階で…
-
最長経路探索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XSLで、XMLの空タグを制御したい。
-
タグの有無の判定
-
XSLでXMLデータをタブ区切りデ...
-
XSLTで固定長データファイルを...
-
XSL中の改行、タブを無効にした...
-
xmlのテキストにリンクを張りた...
-
重複するものを消したい
-
XSLTがブラウザで表示されません。
-
うまく表示されない
-
文字列の取得
-
xsl:param要素をxsl:templateの...
-
value-ofの値を属性値とするには
-
XMLをXSLを使いHTMLに変換した...
-
XMLから指定テキストのみを抜き...
-
ある文字列を含むノードが存在...
-
VBAからxml・スタイルシートを...
-
xsl、xpath式の書き方について
-
XSLで特定のタグだけを出力する...
-
XSL内でJavaScriptを記述し、Ja...
-
XSLTで直下のテキストのみ取得...
おすすめ情報