2014-09-17 5 views
0

У меня есть XML, такие какГруппировка ссылки на функцию XPath в пределах произвольного множества элементов

<doc> 
<Object id="x"> 
    <Attributes> 
    <MATERIAL>PLA</MATERIAL> 
    <METHOD>Inserted</METHOD> 
    <PRESSURE>HP</PRESSURE> 
    </Attributes> 
</Object> 
<Object id="y"> 
    <Attributes> 
    <MATERIAL>P</MATERIAL> 
    <METHOD>Unknown</METHOD> 
    <PRESSURE>HP</PRESSURE> 
    </Attributes> 
</Object> 
. 
. 
. 
</doc> 

где элемент объекта появляется априорным неизвестное число раз, и я хочу, чтобы иметь выражение XPath, который возвращает 0 или 1, если условие выполняется в любом (по крайней мере 1) объектов.

Делать что-то вроде

number(boolean(//Object/Attributes[(MATERIAL="PLA")])) * number(boolean(//Object/Attributes[(METHOD="Unknown")])) 

возвращает 1, потому что оба они истинны где-то, но я хочу 0, потому что нигде в любом одном объекте являются они оба истинны.

Я ограничен XML 1.0.

Я надеялся на гладкое решение, возможно, связанное с каким-то предикатом объекта, который я не смог обнаружить.

Каждый атрибут объекта уникален, если его можно использовать.

Опираясь на параллель с SQL, я хочу как-то группировать объект при применении условия интереса.

Хотя я могу программно извлекать объекты и обрабатывать их индивидуально, я бы действительно не хотел!

ТИА, Дэйв

ответ

1

Похоже, вам просто нужно использовать and:

number(boolean(//Object[Attributes/MATERIAL = "PLA" and 
         Attributes/METHOD = "Unknown"])) 

Если вы пишете XPath вручную (в противоположность сшивая вместе динамически), вы можете дополнительно упростить этот конкретный пример:

number(boolean(//Object/Attributes[MATERIAL = "PLA" and METHOD = "Unknown"])) 
Смежные вопросы