次のような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>
私は間違って何をしていますか?
_.
_を使用すると、実際には現在の(または「コンテキスト」)ノードを参照できますが、ここでの使用方法は参照できません。 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>
_
For-eachの現在のノードの値をテストする条件を設定しようとしていますが、何か間違ったことをしています:
最初に間違っているのは構文です:
_ .[='1112']
_
ここには2つの間違いがあります:
[と]内に述語はありません: "="演算子には2つの引数が必要ですが、1つだけが提供されます。
_.[x = y]
_はまだ構文が無効ですが、述部はOKです。これは次のように指定する必要があります。
self :: node()[条件]
2番目のもの提供されたコードでは改善できるは_<xsl:for-each>
_命令であり、まったく必要ありません。単一のXPath式で十分です。
要約すると、必要なブール値に評価されるXPath式の1つは次のとおりです。
_ /books/book[. = '1112']
_
_<xsl:for-each>
_命令内で条件をテストする必要がある場合、使用する正しいXPath式は次のとおりです。
_ . = '1112'
_
上記は文字列比較であり、スペースが存在する場合はtrue()
と評価されない場合があります。したがって、数値比較のほうが良い場合があります:
_ . = 1112
_
Benはあなたの質問に正しく答えましたが、for-eachの使用は間違いなく一般的なアプローチです。結局これはXSLTです。したがって、おそらく次のようなものを探しているでしょう。
<xsl:if test="/books/book[text()='1112']">
Success
</xsl:if>
XSLTには、この問題専用の機能があります。
これで試してください
<xsl:for-each select="/books/book">
<xsl:if test="current() = '1112'">
Success
</xsl:if>
</xsl:for-each>