2013-12-17 3 views
2

У меня есть файл данных xml, подобный этому.Узлы списка XQuery содержат все атрибуты

<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 = x02, которая имеет землю и здание.

Теперь я не знаю, как это записать, но мне, возможно, придется использовать every in satisfies для проверки всех элементов. Я уточню свой код, если узнаю еще кое-что.

Есть ли какие-либо идеи для поиска атрибутов по всем элементам.

ответ

2

Найти все отличные компании ids, и для каждого из них посмотреть все свойства и посмотреть, есть ли оба типа зданий и земли.

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 :) 

Это будет особый интерес, если у Вас есть больше, чем этот набор типов свойств, чтобы проверить против.

Смежные вопросы