我有一塊XML的像這樣:測試一個XML屬性
<root>
<foo src=""/>
<foo src="bar"/>
<foo />
</root>
我想知道哪些元素具有src屬性,這是空的,哪些具有價值。
我來的最遠的是
$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml
bar
雖然這並沒有告訴我第三FOO缺少的屬性。
我有一塊XML的像這樣:測試一個XML屬性
<root>
<foo src=""/>
<foo src="bar"/>
<foo />
</root>
我想知道哪些元素具有src屬性,這是空的,哪些具有價值。
我來的最遠的是
$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml
bar
雖然這並沒有告訴我第三FOO缺少的屬性。
這將選擇沒有src
屬性的foos。
/root/foo[not(@src)]
對於其他兩項任務,我會使用表達式的混合指出的@TOUDIdel和@Dimitre Novatchev: /root/foo[@src and string-length(@src)=0]
用於FOOS與空src
,並/root/foo[@src and string-length(@src)!=0]
用於FOOS在一個src
與內容它。除此之外,我會避免使用「任意位置」選擇器//
(更不用說*
通配符),除非您確定這是您特別需要的。 //
就像是讓你非常渴望的狗嗅一塊佈告訴它,「把所有聞起來像這樣的東西,無論你在哪裏找到它都帶給我」。你不會相信它可以決定帶回來的奇怪廢話。
/root/foo[string-length(@src)!=0]
全部返回foo元素具有非空值。
不幸的是/root/foo[string-length(@src)=0]
表示不具有SRC元素屬性,也有要素的src 屬性但空。
那麼這並不能解決問題呢!我需要重點區分屬性何時缺失和何時屬性爲空。 :-) – hendry 2011-04-07 12:13:37
使用:
//*[@src and not(string-length(@src))]
這將選擇的XML文檔在具有src
屬性,其字串值具有零長度的所有元素。
//*[@src and string-length(@src)]
這將選擇的XML文檔在具有src
屬性,其字符串值具有長度不爲零的所有元素。
//*[@src and string-length(normalize-space(@src))]
這將選擇的XML文檔在具有src
屬性,其不包括起始和結束空白後字符串值具有長度不爲零的所有元素。
//[not(@src)]
這將選擇XML文檔中沒有src
屬性的所有元素。
我仍然沒有看到測試src屬性的方法。 :/我想標記'
@Hendry:爲什麼所有的表達式都測試了一下:'someExpr [@src]'表示:選擇'someExpr'選擇的所有節點,並具有'src'屬性。 – 2011-04-07 14:37:14
@Dimetre:拼寫出來,他的意思是測試'src'屬性不存在。只需使用'not'運算符;看到我的答案。 – 2011-04-07 14:53:59
我想知道哪些元素具有src屬性,它們是空的並且具有值。具有
@src
屬性,它是空的(沒有字符串值)
元素:具有@src
屬性具有值(字符串值)
//*[@src[not(string())]]
元素:
//*[string(@src)]
從http://www.w3.org/TR/xpath/#section-String-Functions
通過返回首先按文檔順序排列的節點集中節點的字符串值,將節點集轉換爲字符串。如果節點集爲空,則返回空字符串。
從http://www.w3.org/TR/xpath/#function-boolean
的字符串爲真,當且僅當其長度爲非零的。
會'// * [not(string())]'是指沒有任何屬性的東西嗎? – someone 2016-03-07 22:44:28
好問題,+1。查看我的答案,獲取每個案例的完整和簡短解決方案(單行XPath表達式)。 :) – 2011-04-07 13:40:24
@Dimitre:「完整」:不完全... – 2011-04-07 15:18:03