XQuery列表节点包含所有属性

时间:2013-12-17 17:14:53

标签: xml xpath xquery

我有像这样的xml数据文件。

<info>
  <property id="p1" type="land">
    <name>Time Square</name>
    <owner type="person" id="x01" />
    <owner type="company" id="x01" />
  </property>
  <property id="p2" type="building">
    <name>HBE Complex</name>
    <owner type="company" id="x01" />
    <owner type="company" id="x02" />
    <owner type="person" id="x02" />
  </property>
  <property id="p3" type="land">
    <name>UNE Home</name>
    <owner type="company" id="x02" />
    <owner type="person" id="x02" />
  </property>
  <!-- more properties -->
</info>

我想列出所有公司的所有类型属性的ID。 例如公司id = x02,有土地和建筑物。

现在,我不知道如何编写它,但我觉得可能必须使用every in satisfies来检查每个元素。如果我想出更多的话,我会更新我的代码。

是否有任何想法可以跨元素查找属性。

1 个答案:

答案 0 :(得分:2)

查找所有不同的公司ID,并为每个公司查找所有属性,看看是否有建筑和土地类型。

for $id in distinct-values(//owner[@type='company']/@id)
let $properties := //property[owner[@type='company' and @id=$id]]
where $properties/@type='land' and $properties/@type='building'
return $id

satisfies实现了一种隐式循环。你永远不需要它,但有时可以产生更易读的代码。您可以使用satisfies,例如:

(: snip :)
where every $type in ('land', 'building') satisfies $properties/@type=$type
(: snip :)

如果你有超过这套属性类型要检查,这将是特别有趣的。