我有以下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>
答案 0 :(得分:21)
但是,我想使用多个过滤器 在for-each
中
您真正的问题是XPath :是否有可能以及如何在谓词中指定多个条件?
<强>答案强>:
是的,使用标准的XPath布尔运算符or
和and
以及标准的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>