Выражение XPATH для выбора родителей с двумя детьми, у которых есть дети - PullRequest
1 голос
/ 16 марта 2011

У меня есть XML-структура, подобная этой:

<Header>
    <ElementA>
        <ElementB>
            <ElementC/>
            <ElementC/>
        </ElementB>
        <ElementB/>
    </ElementA>
</Header>

, где <ElementB> может иметь последовательность <ElementC> или может не иметь ни одной.

Я могу выбрать <ElementA> узлов, которые имеют два <ElementB> на /Header/ElementA/ElementB/following-sibling::ElementB. Я могу выбрать <ElementA> узлы, которые содержат <ElementB> узел, который содержит <ElementC>, используя /Header/ElementA/ElementB[ElementC].

Но как мне выбрать <ElementA> узлы, которые содержат <ElementB>, который содержит <ElementC>, за которым следует еще <ElementB>, содержащий еще один <ElementC>. Примерно так:

<Header>
    <ElementA>
        <ElementB>
            <ElementC/>
            <ElementC/>
        </ElementB>
        <ElementB>
            <ElementC/>
            <ElementC/>
        </ElementB>
    </ElementA>
</Header>

Ответы [ 3 ]

9 голосов
/ 16 марта 2011

Обратите внимание, что вам не нужно явно искать ось следующего брата.Эти два шаблона вернут один и тот же результат:

foo[bar/following-sibling::bar]

и

foo[bar[2]]

Таким образом, ваш шаблон может быть таким простым:

/Header/ElementA[ElementB[ElementC][2]]

, который найдет ElementA элементов, которые имеют два или более дочерних элемента ElementB, у каждого из которых есть дочерний элемент ElementC.

3 голосов
/ 16 марта 2011

Возможно, я только что ответил на свой вопрос:

/Header/ElementA[ElementB[ElementC]/following-sibling::ElementB[ElementC]]

похоже на работу. Причина, по которой он не работал раньше, заключается в том, что в моем документе, на всех 88 000 строк, такого шаблона не было. Это, вероятно, указывает на ошибку в коде, который его производит, а не на мое выражение XPATH.

2 голосов
/ 16 марта 2011

Вложенный предикат выполняет свою работу:

/Header/ElementA[ElementB[following-sibling::ElementB/ElementC]/ElementC]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...