2011-01-13 47 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> 
相關問題