web-dev-qa-db-ja.com

XSL for-eachテストで現在のノード値を参照する方法

次のようなXMLドキュメントがあるとします。

<books>
    <book>1110</book>
    <book>1111</book>
    <book>1112</book>
    <book>1113</book>
</books>

for-eachの現在のノードの値をテストする条件を設定しようとしていますが、何か間違っています:

<xsl:for-each select="/books/book">
    <xsl:if test=".[='1112']">
        Success
    </xsl:if>
</xsl:for-each>

私は間違って何をしていますか?

27
David

_._を使用すると、実際には現在の(または「コンテキスト」)ノードを参照できますが、ここでの使用方法は参照できません。 XPathでは、_.[foo]_は有効な構文ではありません。代わりにself::node()[foo]を使用する必要があります。また、_=_演算子には、何かに一致するものが必要です。この場合、要素のテキストコンテンツにアクセスするにはtext()セレクターが必要です。

_<xsl:for-each select="/books/book">
    <xsl:if test="self::node()[text()='1112']">
        Success
    </xsl:if>
</xsl:for-each>
_

ただし、他の回答で述べたように、_for-each_が他の操作も実行している場合を除き、まったく繰り返す必要はなく、ifだけを使用して同じタスクを実行できます。

_<xsl:if test="/books/book[. = 1112]">
    Success
</xsl:if>
_
41
Ben Blank

For-eachの現在のノードの値をテストする条件を設定しようとしていますが、何か間違ったことをしています:

最初に間違っているのは構文です

_   .[='1112']
_

ここには2つの間違いがあります

  1. [と]内に述語はありません: "="演算子には2つの引数が必要ですが、1つだけが提供されます。

  2. _.[x = y]_はまだ構文が無効ですが、述部はOKです。これは次のように指定する必要があります。

    self :: node()[条件]

2番目のもの提供されたコードでは改善できるは_<xsl:for-each>_命令であり、まったく必要ありません。単一のXPath式で十分です。

要約すると、必要なブール値に評価されるXPath式の1つは次のとおりです。

_   /books/book[. = '1112']
_

_<xsl:for-each>_命令内で条件をテストする必要がある場合、使用する正しいXPath式は次のとおりです。

_   . = '1112'
_

上記は文字列比較であり、スペースが存在する場合はtrue()と評価されない場合があります。したがって、数値比較のほうが良い場合があります

_  . = 1112
_
13

Benはあなたの質問に正しく答えましたが、for-eachの使用は間違いなく一般的なアプローチです。結局これはXSLTです。したがって、おそらく次のようなものを探しているでしょう。

<xsl:if test="/books/book[text()='1112']">
  Success
</xsl:if>
3
tcurdt

XSLTには、この問題専用の機能があります。

http://www.w3.org/TR/xslt#function-current

3
Dominic Cronin

これで試してください

<xsl:for-each select="/books/book">
    <xsl:if test="current() = '1112'">
        Success
    </xsl:if> 
</xsl:for-each>
1
Shaiful Islam