2016-07-15 23 views
1

所以,我有一個XPath表達式來獲得的屬性值我感興趣的:XPath:將函數應用於所有匹配?

//ElementName/@AttributeName 

我想要的屬性作爲字符串的只是價值。我可以這樣做:

string(//ElementName/@AttributeName) 

但這隻適用於第一個節點的功能。我想(我使用的命令行,這會打印出表達式的結果xmllint應用string()比賽,連接在一起的所有的結果,所以它並不需要一個結構化的類型結果)。我認爲這可能工作:

//ElementName/string(./@AttributeName) 

但是,這給了我一個語法錯誤,就像我嘗試的變化。所以目前,我這樣做:

count=$(xmllint --xpath 'count(//ElementName/@AttributeName)' file.xml) 
for ((i=1; i<=count; ++i)); do 
    echo "$(xmllint --xpath "string((//ElementName/@AttributeName)[$i])" file.xml)" 
done 

這似乎...效率低下,至少。有沒有更好的辦法?

回答

2

使用XPath 2.0(或XQuery 1.0)和更高版本,您可以使用//ElementName/@AttributeName/string()的方法獲取所有字符串值序列或string-join(//ElementName/@AttributeName, '')將它們連接在一起。但是在XPath 1.0中,您總是需要像以前一樣使用主機語言。

+1

,看來,'libxml',這'xmllint'僅僅是一個命令行界面,仍然只支持XPath 1.0。好。謝謝! –