如何在XSLT for-each语句中添加多个过滤器?

时间:2011-01-13 23:33:05

标签: xslt xpath filter foreach

我有以下XSLT节点:

<xsl:for-each select="Book[title != 'Moby Dick']">
....
</xsl:for-each>

但是,我想在for-each中使用多个过滤器。我尝试了以下内容,但它似乎不起作用:

<!-- Attempt #1 -->
<xsl:for-each select="Book[title != 'Moby Dick'] or Book[author != 'Rowling'] ">
....
</xsl:for-each>


<!-- Attempt #2 -->
<xsl:for-each select="Book[title != 'Moby Dick' or author != 'Rowling']">
....
</xsl:for-each>

3 个答案:

答案 0 :(得分:21)

  

但是,我想使用多个过滤器   在for-each

您真正的问题是XPath 是否有可能以及如何在谓词中指定多个条件?

<强>答案

是的,使用标准的XPath布尔运算符orand以及标准的XPath函数not()

在这种特殊情况下,select属性中的XPath可能

Book[title != 'Moby Dick' or author != 'Rowling']

我个人总是喜欢写一个等价的表达式:

Book[not(title = 'Moby Dick') or not(author = 'Rowling')]

因为!=运算符在其某个操作数是节点集时具有非直观行为。

但我猜你可能想要的是and两个比较 - 而不是or他们

答案 1 :(得分:1)

如果你想要多个谓词,最简单的方法就是使用多个谓词。我猜你真的想要一个“和”而不是一个“或”:

<xsl:for-each select="Book[title != 'Moby Dick'][author != 'Rowling'] ">
....
</xsl:for-each>

通常最好避免使用!=运算符,因为当作者不在或有多位作者时,它会产生意想不到的效果。最好写一下:

<xsl:for-each select="Book[not(title = 'Moby Dick')][not(author = 'Rowling')] ">
....
</xsl:for-each>

答案 2 :(得分:0)

显然,我忘了刷新数据。尝试#2工作得非常好。希望这个例子可以帮助别人。

<!-- Attempt #2 -->
<xsl:for-each select="Book[title != 'Moby Dick' or author != 'Rowling']">
....
</xsl:for-each>