2011-04-07 52 views
16

我有一塊XML的像這樣:測試一個XML屬性

<root> 
    <foo src=""/> 
    <foo src="bar"/> 
    <foo /> 
</root> 

我想知道哪些元素具有src屬性,這是空的,哪些具有價值。

我來的最遠的是

$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml 

bar 

雖然這並沒有告訴我第三FOO缺少的屬性。

+0

好問題,+1。查看我的答案,獲取每個案例的完整和簡短解決方案(單行XPath表達式)。 :) – 2011-04-07 13:40:24

+0

@Dimitre:「完整」:不完全... – 2011-04-07 15:18:03

回答

23

這將選擇沒有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與內容它。除此之外,我會避免使用「任意位置」選擇器//(更不用說*通配符),除非您確定這是您特別需要的。 //就像是讓你非常渴望的狗嗅一塊佈告訴它,「把所有聞起來像這樣的東西,無論你在哪裏找到它都帶給我」。你不會相信它可以決定帶回來的奇怪廢話。

+1

我愛狗和布比喻!= 0 – Dustin 2013-12-12 08:54:19

+0

謝謝你的回答,我在哪裏可以找到「字符串長度「功能和其他? – someone 2016-03-07 22:21:04

+0

https://www.w3.org/TR/xpath/#function-string-length – 2016-03-08 08:15:27

2

/root/foo[string-length(@src)!=0]全部返回foo元素具有非空值。

不幸的是/root/foo[string-length(@src)=0]表示不具有SRC元素屬性,也有要素的src 屬性但空。

+0

那麼這並不能解決問題呢!我需要重點區分屬性何時缺失和何時屬性爲空。 :-) – hendry 2011-04-07 12:13:37

2

使用

//*[@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屬性的所有元素。

+0

我仍然沒有看到測試src屬性的方法。 :/我想標記''因爲缺少src屬性。 – hendry 2011-04-07 13:48:16

+0

@Hendry:爲什麼所有的表達式都測試了一下:'someExpr [@src]'表示:選擇'someExpr'選擇的所有節點,並具有'src'屬性。 – 2011-04-07 14:37:14

+0

@Dimetre:拼寫出來,他的意思是測試'src'屬性不存在。只需使用'not'運算符;看到我的答案。 – 2011-04-07 14:53:59

10

我想知道哪些元素具有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

的字符串爲真,當且僅當其長度爲非零的。

+0

會'// * [not(string())]'是指沒有任何屬性的東西嗎? – someone 2016-03-07 22:44:28