如何在每个测试中引用XSL中的当前节点值?

27 xml xslt xpath

假设我有一个像这样的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)

这里有两个错误:

  1. 在[和]内没有谓词:"="运算符需要两个参数,但只提供一个.

  2. .[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)