2014-01-16 80 views
1

我需要提供一個查詢,該查詢可以提供沒有任何項目的類型的產品如果某個項目是服裝類型,並且沒有服裝項目出現在交易清單中,我需要顯示它。XPath查詢:查找具有與屬性相同的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="salmon mooseMeat" sumPrice="365"/>  
<transaction products="hockeyPuck hockeyStick" sumPrice="35"/> 
<transaction products="hockeyStick mooseMeat" sumPrice="380"/> 
<transaction products="salmon mooseMeat" sumPrice="300"/> 
<transaction products="hockeyStick hockeyStick hockeyStick" sumPrice="30"/> 
</store> 

所需的輸出

<transaction products="salmon mooseMeat" sumPrice="365"/> 
<transaction products="salmon mooseMeat" sumPrice="300"/> 

,因爲他們具有相同的產品作爲另一交易交易(eachother)

MY ATTEMPT 我玩過一些查詢,但我無法正確理解。這是我已經得到最接近:

這是我已經試過:

//transaction[id(@products) = //transaction/@products] 

看起來這應該工作 - 發現其產品符合所有其他交易產品屬性的所有事務。然而,它沒有獲得任何獎項。

回答

2

編輯:出於某種原因,我認爲這是一個XSLT問題。這裏是你可以只用XPath的做到這一點的一種方法:

//transaction[(@products = preceding-sibling::transaction/@products or 
       @products = following-sibling::transaction/@products)] 

這裏是你如何可以查詢所有這些不同的元素(需要的XPath 2.0):

//transaction[(@products = preceding-sibling::transaction/@products or 
       @products = following-sibling::transaction/@products) and 
       not(concat(@products, '+', @sumPrice) = 
        preceding-sibling::transaction/concat(@products, '+', @sumPrice))] 

這裏有一種方法用XSLT來做到這一點:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:key name="kTrans" match="transaction" use="@products" /> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*"> 
    <n> 
     <xsl:apply-templates select="transaction[key('kTrans', @products)[2]]" /> 
    </n> 
    </xsl:template> 
</xsl:stylesheet> 

當你的樣品輸入運行,其結果是:

<n> 
    <transaction products="salmon mooseMeat" sumPrice="365" /> 
    <transaction products="salmon mooseMeat" sumPrice="300" /> 
</n> 

請注意,我將結果封裝在n元素中,因爲使用多個根元素的XML無效。

+0

它的工作原理!謝謝!但是,有沒有辦法只返回不同的元素?當'sumPrice'是相同的,它不應該同時打印。 – CodyBugstein

+0

你知道你的XPath引擎是否可以使用XPath 2.0嗎?我可以想辦法在XPath 2.0中排除重複項,但不是在1.0中。 – JLRishe

+0

nope它不能:( – CodyBugstein

相關問題