2

XSLT スタイルシートに取り組んでいます。たくさんの子を持つノード (ノード A) があり、別のノード (ノード B) の子をループしています。ノード B の子がノード A の子でもあるたびに何かをしようとしているので、次のコードがあります。

<xsl:if test="$prodbins/bin[./text()=/root/Line[1]/Element[6]/text()]">

しかし、それは機能しません (テストは失敗し、式は false を返します)、式の左辺と右辺が別々に評価された場合に等しいにもかかわらずです。

しかし、私がこれを行うとき:

<xsl:variable name="curbin" select="/root/Line[1]/Element[6]/text()"/>
<xsl:if test="$prodbins/bin[./text()=$curbin]">

式は true と評価されます。期待した結果を得るために $curbin 変数を使用する必要があるのはなぜですか?

4

2 に答える 2

2

試してみてください<xsl:if test="$prodbins/bin[./text()=current()/root/Line[1]/Element[6]/text()]">(current()関数に注意してください)。元の式で機能しない理由は、変数をクエリして、/変換しているソースドキュメントではなく、変数のコンテンツのルートノードを検索するためです。current()は、現在のテンプレートのコンテキスト要素を返す必要があります。

于 2012-11-21T18:58:16.637 に答える
1

私の推測では、これ$prodbins/binは、と比較されているノードを含むドキュメントとは異なるドキュメントに属するノード(-set)です。

式では:

   $prodbins/bin[./text()=/root/Line[1]/Element[6]/text()]

部分式

   /root/Line[1]/Element[6]/text()

ノードが選択されたドキュメントと同じドキュメントから選択します。$prodbins/bin

必要な比較を正常に指定する1つの方法は、次のとおりです。

<xsl:variable name="vDoc" select="/"/>

<xsl:if test="$prodbins/bin[./text()=$vDoc/root/Line[1]/Element[6]/text()]">
于 2012-11-21T19:32:08.240 に答える