2017-05-15 48 views
0

與30K +文件的數據庫上工作,每個水果單獨的.xml有點比這更復雜的內:結合的XPath /無法施展的xs:untypedAtomic類型節點

<Fruit> 
<Node1 name="papaya"><Childnode1 skincolor="YELLOW"></Childnode1></Node1> 
<Node2 color="red"></Node2> 
</Fruit> 

<Fruit> 
<Node1 name="apple"><Childnode1 skincolor="red"></Childnode1></Node1> 
<Node2 color="Yellow"></Node2> 
</Fruit> 

<Fruit> 
<Node1 name="banana"><Childnode1 skincolor="yELLOW"></Childnode1></Node1> 
<Node2 color="yellow"></Node2> 
</Fruit> 

我找了相同的字符串兩不同的屬性:

/Fruit/Node1/Childnode1[matches(@skincolor,'yellow','i')/data(Fruit/Node1/@name) /Fruit/Node2[matches(@color,'yellow','i')]/data(Fruit/Node1/@name)

一些結果是重複的(僅在該實例中香蕉),所以我試圖兩個路徑改寫成一個單一的表達:

/Fruit/Node1/Childnode1[matches(@skincolor,'yellow','i')/data(Fruit/@name) | /Fruit/Node2[matches(@color,'yellow','i')]/data(Fruit/@name)

出現錯誤:「無法將xs:untypedAtomic轉換爲節點()」。我的意圖是將它們結合起來,然後只保留不同的值。 我是新來的XML /編程/ SO,所以請解釋我喜歡5(和學習代碼)。

+0

請注意,您的第一個XPath無效。如果您在將查詢提交給Stack Overflow之前檢查了它們,這對讀者會有所幫助。 –

+0

對混淆抱歉。我的筆記本電腦處於不良狀態,所以簡單的查詢花了半個小時。下次會更加小心。 – wlwy

回答

0

union運算符僅適用於節點的集合/序列,但調用數據的表達式()函數返回的原子序列值。

無論如何,您的原始路徑表達式都是錯誤的。如果再加上缺少「]」,你有

/Fruit/Node1/Childnode1[matches(@skincolor,'yellow','i')]/data(Fruit/@name)

,不會選擇任何內容,因爲Fruit/@name上下文項是Childnode1元素,它不具有Fruit孩子。它應該是,例如

/Fruit[Node1/Childnode1[matches(@skincolor,'yellow','i')]]/data(@name)

爲了消除你需要考慮究竟你的意思重複重複。如果你有兩個不同的Fruit元素,都與@name="banana",你想把它們作爲重複或不重複?如果情況沒有出現,那麼你可以採取任何方式。如果通過重複表示「兩個表達式選擇相同的水果元素」,則可以使用聯合運算符「|」消除重複。如果你的意思是「這兩個表達式都選擇與@name具有相同值的Fruit元素」,那麼你應該使用distinct-values()。

+0

只是現在意識到爲什麼沒有預期的結果。我原來的xpath已經關閉了,但是你的xpath修正了這個技巧。事實上,我擁有不同的條目,其中@name的值相同。將使用聯合運營商。非常感謝! – wlwy

1

的函數fn:不同值可用於該:

distinct-values(/Fruit/(
    Node1/Childnode1[matches(@skincolor,'yellow','i')], 
    Node2[matches(@color,'yellow','i')] 
)/Fruit/@name) 
+0

更正了xpath導致沒有命中,因爲我的表達式選擇了錯誤的級別。儘管如此。 – wlwy

相關問題