2012-11-23 33 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 |电话)' –