繁体   English   中英

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

[英]How to refer to current node value in XSL for-each test?

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

这里有两个错误

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

  2. 虽然谓词没问题, .[x = y]仍然是无效的语法 这必须指定为:

    自::节点()[条件]

提供的代码中可以改进 的第二件事<xsl:for-each>指令,这根本不是必需的; 单个XPath表达式就足够了。

总而言之 ,一个可能的XPath表达式求值为所需的布尔值:

   /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具有专门针对此问题的功能。

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

试试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM