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

时间:2009-02-10 23:58:43

标签: xml xslt xpath

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

我做错了什么?

5 个答案:

答案 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']

这里有两件事错误

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

  2. .[x = y]语法仍然无效,但谓词正常。必须将其指定为:

    自::节点()[条件]

  3. 提供的代码中可以改进的第二件事 <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具有专门针对此问题的功能。

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

答案 4 :(得分:1)

试试这个

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