2013-03-25 45 views
0

由於父母和孩子的屬性值:的XPath來連接在一個查詢

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<report Id="0" > 
<property name="comments">comment</property> 
<property name="test">sdcs</property> 
<property name="test">csd</property> 
<property name="eventHandlerClass">sdcs</property> 
</report> 
<report Id="1"> 
<property name="comments">comment</property> 
<property name="test">dcs</property> 
<property name="test">gds</property> 
<property name="test">jds</property> 
<property name="eventHandlerClass">sdcs</property> 
</report> 
</root> 

預期輸出:

Id=0, test=sdcs 
Id=0, test=csd 
Id=1, test=dcs 
Id=1, test=gds 
Id=1, test=jds 

只有找一個普通的Xpath 1.0實現這一目標。嘗試varioud函數和謂詞,但沒有得到像上面那樣的輸出。 基本上,閱讀後我應該能夠判斷哪個「測試」屬於哪個報告ID。

嘗試:

/root/report/@Id | /root/report/property[@name="test"] - 但給出的結果中單獨的行

/root/report/ (@Id | property[@name="test"]) - 但給出的結果中單獨的行

concat(/root/report/@Id, /root/report/property[@name="test"]) - 給出錯誤(認爲的毗連適用於單行結果)

string-join(/root/report/@Id | /root/report/property[@name="test"] , ',') - 所有內容都是單行,即使是兩個報告ID。

回答

1

您可以使用該保留的ID在一個變量:

for $report in /root/report 
return for $property in $report/property[@name="test"] 
return concat("Id=", $report/@Id, ", ", $property/@name, "=", $property) 

或更短:很典雅,通過使初級「迭代元素」

for $report in /root/report return 
$report/property[@name="test"]/ 
concat("Id=", $report/@Id, ", ", @name, "=", .) 
+0

這是正是我需要的!但是,不幸的是在XPath 1.0中不可用! – 2013-03-25 21:49:01

+0

我認爲XPath 1中不可能這樣做,因爲您只能選擇每個節點一次,並且只能在最後使用值。除非對大小有嚴格的限制(例如只有兩個報表節點)(你的第二個例子是XPath 2,而不是1,不是嗎?) – BeniBela 2013-03-26 00:34:29

+0

是的,它是XPath 2.我嘗試了所有不同的選項,但沒有檢查在實際系統中。隨着您的解決方案意識到我有使用XPath 1.0的限制。 – 2013-03-26 05:30:25

0

你可以這樣做是最深的孩子 - 在這個例子中,XML根元素是TABLE。看看我們如何「迭代」更深的孩子COLUMN。我們採取列的@name(第二),並添加parent's父母的@name屬性

/TABLE/COLUMNS/COLUMN/concat(../../@name, ' : ', @name) 

這就不需要使用變量作爲父母的@name