2013-04-08 63 views
3

我有一個XML這樣的:如何獲得屬性值,如果它們不等於某些值?

<movies> 
    <movie name="aaa"> 
     ... 
    </movie> 
    <movie name="bbb"> 
     ... 
    </movie> 
    <movie name="ccc"> 
     ... 
    </movie> 
    <movie name="ddd"> 
     ... 
    </movie> 
    <movie name="eee"> 
     ... 
    </movie> 
</movies> 

我想獲得該電影的名字,如果它不是「AAA」或「BBB」,或「DDD」。所以,我想我的輸出是:

ccc 
eee 

因爲我有一些限制,我不認爲這是適合使用「的xsl:如果」 ..我寫我喜歡的XSLT(我使用XSLT 1.0 ):

<xsl:value-of select="movies/movie/@name[not(self::aaa) and not(self::bbb) and not(self:ddd)]"/> 

但是,編譯器抱怨有這sentence..and我想不出一個語法錯誤,爲什麼..

所以可能有人幫助我嗎?非常感謝!!

回答

3

試試這個XPath表達式:

movies/movie[@name!='aaa' and @name!='bbb' and @name!='ddd']/@name 

或者這一個:

movies/movie/@name[.!='aaa' and .!='bbb' and .!='ddd'] 

後者更短,但前者可以很容易地擴展到檢查其他的回報不僅名字,但整個<movie>元素 - 最後刪除/@name。或者如果你想要第二個,只需在最後加上/..即可。

+0

嗨,謝謝你的回答。第一個解決方案奏效。其實我也想出了那個,但是因爲我是xslt的新手,我想知道第一個xpath是否會讓選擇變慢? – 2013-04-08 22:13:21

+0

@ D.Q .:歡迎您:)如果您真的只需*名稱屬性,那麼第二個表達式就是要走的路。如果你需要整個'',那麼你*必須使用這樣的東西:' Name:
描述:'。或者更好:''。我無法進一步幫助您,因爲我不知道XML的結構,也不瞭解您的轉換的預期結果。 – 2013-04-08 22:22:02

+0

我明白了你的觀點:)並且還有一個問題,如果我還有其他幾個限制,例如我需要排除的名字的數量有點大,比如8或10.還有什麼其他方式可以處理它,這樣我就不會有很長的xpath表達式,這對於進一步的擴展來說不是很好。 .. – 2013-04-08 22:30:49

2

考慮使用像這樣的表達式,如果有太多的一對多值比較:

/*/movie[not(contains('|aaa|bbb|ddd|', concat('|', @name, '|)))]/@name 

這將選擇任何movie元件的任何name屬性,該屬性是的頂部元件的子XSLT文檔,其值(name屬性)不是字符串值爲"|aaa|bbb|ddd|"的管道分隔列表中的字符串之一。

+0

...並且其值是** NOT **管道分隔列表中的一個字符串... – 2013-04-09 10:14:21

+0

@ alex-shesterov,感謝您接收此信息。現在更正。 – 2013-04-09 14:32:52

+0

謝謝@DimitreNovatchev提供這種優秀的解決方案! – 2013-04-09 14:53:10

相關問題