从特定元素获取数据

时间:2017-05-04 23:46:49

标签: xml xquery

我是XML / Xquery的新手,我很难搞清楚这一点。 在下面提供的XML文档中,我试图找到所有写作同名书籍的作者,以及与该书相关的评级。我遇到的问题是我的查询返回的作者的所有评级可能包含多本书以及正在查找的书籍。

XML Doc:

<lib>
<author name="Sally J">
    <book>
        <name>ABC</name>
        <rating>6</rating>
    </book>
    <book>
        <name>Monsters</name>
        <rating>2</rating>
   </book>
    <book>
        <name>Spring Poems</name>
        <rating>5</rating>
   </book>
</author>
<author name="Samantha G">
    <book>
        <name>ABC</name>
        <rating>2</rating>
    </book>
    <book>
        <name>Cooking101</name>
        <rating>7</rating>
   </book>
    <book>
        <name>Aliens?</name>
        <rating>10</rating>
   </book>
</author>
</lib>

我的查询:

 for $x in doc("lib.xml")/lib/author
 where $x/book/name="ABC"
 return ($x/@name, $x/book/rating)

它输出的是:

Sally J

6

2

5

Samantha G

2

7

10

当我只想为每个有一个作者的书“ABC”评级时。我确信解决方案很简单,但我只是缺乏对Xquery中工作原理的具体理解。

1 个答案:

答案 0 :(得分:0)

您的查询是: 对于每位作者,如果该作者的某些书的名称等于“ABC&#39;”,则返回作者的姓名和该作者所有书籍的评级。这是你看到的。要记住的是XPath返回结果序列,因此$ x / book / rating是$ x所有图书孩子的所有评级子集的集合。你想要的是那本名字等于&#39; ABC&#39;的书的评级,所以你也必须把条件放在那里:

for $x in doc("lib.xml")/lib/author[book/name="ABC"] 
return ($x/@name, $x/book[name="ABC"]/rating)