2012-11-23 30 views
1

我對xquery完全陌生,我遇到問題,無法從我的xml代碼中獲取正確的東西。使用xquery進行查詢處理

這裏是我的xml文件的樣本,我的工作就:

<root> 
    <name id = "a"> 
    <first> Mary </first> 
    <last> Britton </last> 
    <company> ABC </company> 
    <phone> 203-942-0485 </phone> 
    </name> 

    <paper pid = "b"> 
    <pname> Hello </pname> 
    <author> a </author> 
    </paper> 

    <publish> 
    <pbid> b </pbid> 
    <location> 
     <place> new york </place> 
     <sales> 100 </sales> 
    </location> 
    <location> 
     <place> los angeles </place> 
     <sales> 200 </sales> 
    </location> 
    </publish> 

我試圖讓筆者所在的公司和電話號碼,對於那些誰已經在紐約出版與至少50個銷售。

現在,我只能得到位置信息,甚至沒有發佈信息。有關如何思考這個問題的任何提示或幫助?提前致謝!

回答

1

此純的XPath 2.0表達式

/*/name[for $auid in @id, 
        $p in /*/paper[author eq $auid], 
        $pid in $p/@pid 
       return 
        sum(/*/publish[pbid[1] eq $pid] 
           /location[place eq 'new york'] 
            /sales 
        ) 
        ge 50 
      ] 
      /(company | phone) 

當對下面的XML文檔(所提供的一個具有多餘的空白消除評價中,爲了避免不必構造一個不必要地複雜的XPath這將使用normalize-space()幾乎無處不在的表達):

<root> 
    <name id = "a"> 
     <first> Mary </first> 
     <last> Britton </last> 
     <company> ABC </company> 
     <phone> 203-942-0485 </phone> 
    </name> 
    <paper pid = "b"> 
     <pname> Hello </pname> 
     <author>a</author> 
    </paper> 
    <publish> 
     <pbid>b</pbid> 
     <location> 
      <place>new york</place> 
      <sales> 100 </sales> 
     </location> 
     <location> 
      <place> los angeles </place> 
      <sales> 200 </sales> 
     </location> 
    </publish> 
</root> 

產生想要的,正確的結果

<company> ABC </company> 
<phone> 203-942-0485 </phone> 
+0

非常感謝!我還有一個問題,你可以在xpath中排序嗎?我知道你可以通過xquery來完成訂單。例如,如果我想根據發佈中的pbid對結果進行排序,我應該怎麼做?謝謝! –

+0

@CathyClaires,不,你不能在XPath中排序(除非在初始評估上下文中提供了一個可用於排序的函數)。如果你想使用XQuery,那麼你可以使用'order by'子句。 –

+0

@CathyClaires,像這樣的XQuery:'爲$ X在 \t \t \t/* /名稱[以$ AUID在@id, \t \t \t \t $ P在/ * /文[作者EQ $ AUID], $ p中\t \t \t \t $ PID/@ PID \t \t \t \t返回 \t \t \t \t總和(/ * /發佈[pbid [1]當量$ PID] \t \t \t \t /位置[地方當量 '紐約'] \t \t \t \t /銷售 \t \t \t \t) \t \t \t \t GE 50 \t \t \t] 爲了通過(對於在$ @id AUID, $ p in/*/paper [author eq $ auid] \t \t \t \t return \t \t \t \t $ p/@ pid ) return $ x /(company |電話)' –