假设我有一个像这样的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>
我做错了什么?
答案 0 :(得分:41)
实际上,使用.
可以引用当前(或“上下文”)节点,但不是您在此处使用它的方式。在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>
答案 1 :(得分:13)
我正在尝试设置一个条件 测试当前节点的值 for-each,但我正在做点什么 错误:
首先不正确的是语法:
.[='1112']
这里有两件事错误:
在[和]内没有谓词:“=”运算符需要两个参数,但只提供一个。
.[x = y]
语法仍然无效,但谓词正常。必须将其指定为:
自::节点()[条件]
提供的代码中可以改进的第二件事 是<xsl:for-each>
指令,根本不需要;单个XPath表达式就足够了。
总结,一个可能的XPath表达式求值为所需的布尔值:
/books/book[. = '1112']
如果确实需要在<xsl:for-each>
指令内测试条件,那么我将使用的一个正确的XPath表达式是:
. = '1112'
以上是字符串比较,如果周围有空格,可能无法评估为true()
。因此,数值比较可能更好:
. = 1112
答案 2 :(得分:3)
虽然Ben已正确回答了您的问题,但使用for-each绝对是错误的一般方法。毕竟这是XSLT。所以你可能更喜欢这样的东西:
<xsl:if test="/books/book[text()='1112']">
Success
</xsl:if>
答案 3 :(得分:3)
XSLT具有专门针对此问题的功能。
答案 4 :(得分:1)
试试这个
<xsl:for-each select="/books/book">
<xsl:if test="current() = '1112'">
Success
</xsl:if>
</xsl:for-each>