2013-03-20 76 views
0

我有以下XML文件XPath查詢優化

<site> 
    <people> 
    <person id="person0"> 
     <emailaddress>[email protected]</emailaddress> 
    </person> 
    <person id="person1"> 
     <emailaddress>[email protected]</emailaddress> 
    </person> 
    <person id="person2"> 
     <emailaddress>[email protected]</emailaddress> 
    </person> 
    </people> 

    <closed_auctions> 
    <closed_auction> 
    <annotation>123</annotation> 
    <seller person="person1"/> 
    </closed_auction> 
    <closed_auction> 
    <annotation></annotation> 
    <seller person="person2"/> 
    </closed_auction> 
    <closed_auction> 
    <annotation></annotation> 
    <seller person="person3"/> 
    </closed_auction> 
    </closed_auctions> 
</site> 

我們的人的名單和拍賣的列表,你可以看到賣家部分包含對個人ID

我想引用檢查所有closed_auction標記,如果有非空註釋標籤,我必須讓賣家個人ID和打印此賣家的電子郵件地址(這個人)

當前查詢看起來是這樣的:

/網站/人/人[@ ID = /網站/ closed_auctions/closed_auction [註釋/文()] /賣方/ @人]/EMAILADDRESS /文()

此查詢是針對小型的XML文件運行良好大小,但它永遠不會結束大型XML文件。 (我認爲這個問題是關係到嵌套的XPath,但我無法找到任何其他方式)

請你提出任何改進

謝謝

+0

運行兩個查詢而不是一個? – MattH 2013-03-21 00:12:53

+0

開始和結束標記不匹配:'seller' – kev 2013-03-21 00:35:50

+1

在doc(「input.xml」)中嘗試xquery:'for $ x // person let $ y:= root($ x)// seller [@ person = $ x/@id]其中$ y /../ annotation/text()!=「」return $ x/emailaddress/text()' – kev 2013-03-21 00:49:49

回答

0

我要檢查所有的closed_auction標記,如果有非空 註釋標籤,我要得到賣家的人ID和打印此賣家的電子郵件地址 (這個人)

這裏獲得想要emailaddress元素與XSLT轉換的有效方法 - 使用key

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kPersonById" match="person" use="@id"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "key('kPersonById', 
      /*/closed_auctions/*[string(annotation)]/seller/@person)/emailaddress"/> 
</xsl:template> 
</xsl:stylesheet> 

當這種變換所提供的XML文檔應用:

<site> 
    <people> 
    <person id="person0"> 
     <emailaddress>[email protected]</emailaddress> 
    </person> 
    <person id="person1"> 
     <emailaddress>[email protected]</emailaddress> 
    </person> 
    <person id="person2"> 
     <emailaddress>[email protected]</emailaddress> 
    </person> 
    </people> 

    <closed_auctions> 
    <closed_auction> 
    <annotation>123</annotation> 
    <seller person="person1"/> 
    </closed_auction> 
    <closed_auction> 
    <annotation></annotation> 
    <seller person="person2"/> 
    </closed_auction> 
    <closed_auction> 
    <annotation></annotation> 
    <seller person="person3"/> 
    </closed_auction> 
    </closed_auctions> 
</site> 

想要的,產生正確的結果:

<emailaddress>[email protected]</emailaddress>