假设我有一个像这样的XML文档:
<books>
<book>1110</book>
<book>1111</book>
<book>1112</book>
<book>1113</book>
</books>
Run Code Online (Sandbox Code Playgroud)
我正在尝试设置一个条件来测试当前节点的值for-each,但是我做错了:
<xsl:for-each select="/books/book">
<xsl:if test=".[='1112']">
Success
</xsl:if>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
Ben*_*ank 41
.实际上,使用can可以引用当前(或"上下文")节点,但不是指您在此处使用它的方式.在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>
Run Code Online (Sandbox Code Playgroud)
但是,如其他答案中所述,除非您for-each正在执行其他操作,否则您根本不需要迭代,只能if用于完成相同的任务:
<xsl:if test="/books/book[. = 1112]">
Success
</xsl:if>
Run Code Online (Sandbox Code Playgroud)
Dim*_*hev 13
我正在尝试设置一个条件来测试for-each中当前节点的值,但是我做错了:
第一件不正确的是语法:
.[='1112']
Run Code Online (Sandbox Code Playgroud)
这里有两个错误:
在[和]内没有谓词:"="运算符需要两个参数,但只提供一个.
.[x = y]仍然是无效的语法,虽然谓词是好的.这必须指定为:
自::节点()[条件]
提供的代码中可以改进的第二件事是<xsl:for-each>指令,这根本不是必需的; 单个XPath表达式就足够了.
总而言之,一个可能的XPath表达式求值为所需的布尔值:
/books/book[. = '1112']
Run Code Online (Sandbox Code Playgroud)
如果确实需要在<xsl:for-each>指令内测试条件,那么我将使用的一个正确的XPath表达式是:
. = '1112'
Run Code Online (Sandbox Code Playgroud)
以上是字符串比较,如果周围有空格,可能无法评估true().因此,数值比较可能更好:
. = 1112
Run Code Online (Sandbox Code Playgroud)