![](/img/trans.png)
[英]XSLT How to select node attribute value with xsl:for-each and xsl:if
[英]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']
这里有两个错误 :
在[和]内没有谓词 :“=”运算符需要两个参数,但只提供一个。
虽然谓词没问题, .[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具有专门针对此问题的功能。
试试这个
<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.