我有像这样的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
来检查每个元素。如果我想出更多的话,我会更新我的代码。
是否有任何想法可以跨元素查找属性。
答案 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 :)
如果你有超过这套属性类型要检查,这将是特别有趣的。