2014-01-16 50 views
4

我需要提出一個查詢,該查詢給出了沒有銷售商品的類型的產品如果某個商品屬於某種類型服裝,並且沒有服裝項目出現在交易清單中,我需要顯示它。XPath查詢解析一個屬性中的所有IDREFS(可能包含許多ID)

這是我的XML文件(超級加拿大岬道歉):

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE store [ 

<!ELEMENT store (product*, transaction*)> 
<!ATTLIST store name CDATA #REQUIRED > 

<!ELEMENT product EMPTY> 
    <!ATTLIST product 
     name ID #REQUIRED 
     type CDATA #REQUIRED 
     price CDATA #REQUIRED 
    > 

    <!ELEMENT transaction EMPTY> 
    <!ATTLIST transaction 
products IDREFS #REQUIRED 
sumPrice CDATA #REQUIRED 
    > 

]> 
<store name="Gordons"> 
<product name="beaverCoat" type="clothing" price="100"/> 
<product name="hockeyStick" type="equipment" price="30"/> 
<product name="hockeyPuck" type="equipment" price="5"/> 
<product name="icePick" type="equipment" price="40"/> 
<product name="mooseMeat" type="food" price="350"/> 
<product name="salmon" type="food" price="15"/> 
<transaction products="hockeyPuck hockeyStick" sumPrice="35"/> 
<transaction products="hockeyStick mooseMeat" sumPrice="380"/> 
<transaction products="salmon mooseMeat" sumPrice="365"/> 
<transaction products="hockeyStick hockeyStick hockeyStick" sumPrice="30"/> 
</store> 

所需的輸出

<product name="beaverCoat" type="clothing"/> ,因爲它是從一個類(服裝)產品從什麼被買了。即沒有交易包括服裝。

我的嘗試 我已經玩過一些查詢,但我不能說清楚。這是我已經得到最接近:

//product[@type != //transactions/@products/@type]

看起來這應該工作 - 發現所有那些type是所有transactions但是我得到很多的不等於任何type的產品錯誤。

我真的很感激,如果有人可以提供解決方案的一點解釋。

+0

你能發佈所需的輸出嗎? –

+0

@Imray哪一種是使用的編程語言?如果你能夠處理一個excel,那麼你可以使用下面的xpath。這會拋出一個異常,你可以捕捉它。如果拋出異常,那麼它就意味着產品不在那裏。 //產品[@ type =「clothing」] – Vinay

+0

@ThomasW我添加了它 – CodyBugstein

回答

5

可以使用id()函數來獲取節點集被出售的所有物品,使用它的節點集合的transaction元素products屬性:

id(//transaction/@products) 

,你可以輕鬆地擴展,要得到已售出的商品type

id(//transaction/@products)/@type 

你想要的是所有的產品,該type在這一套,由下式給出:

//product[not(@type = id(//transaction/@products)/@type)] 

你的示例XML使用此只選擇beaverCoat產品節點。

+0

我不遠處,我正在嘗試'// product [not(@type = // transaction /(id(@products)/ @ type)]'。爲什麼不能正常工作? – CodyBugstein

+0

@Imray我認爲這是因爲你不能像'// transaction /(id(@products)'中那樣使用函數作爲節點測試的一部分,你可以_extend_函數的結果,因爲它返回一個節點集,但是你不能把它放在這樣的查詢中。 – matt