2011-01-13 49 views
6

我有以下XSLT节点:如何将多个过滤器添加到XSLT for each语句中?

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

你应该提供XML示例。 – Flack 2011-01-13 23:34:59

+0

好问题,+1。请参阅我的答案以获得解释和几种单线解决方案。 :) – 2011-01-14 03:04:25

回答

19

不过,我想使用多个过滤器 中的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两个comparissons - 不or他们

0

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

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

@Dimitre - 如果罗琳写了一本名为“莫比迪克”的书,那么这本书的谓词肯定是错误的? – 2011-01-14 08:54:53

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> 
相关问题