Является ли этот простой запрос XPath правильным? - PullRequest
2 голосов
/ 05 февраля 2011

У меня есть документ в следующем формате:

<Root>
    <A />
    <C />
    <B />
    <A>
        <B>
            <A />
            <C /> 
        </B>
    </A>
</Root>

Я хочу «поймать» все элементы A и B и вывести их в новый документ:

<A /> <B /> <A /> <B /> ...

С XPath запрос будет (с Root в качестве узла контекста):

.//*[A | B]

Ответы [ 3 ]

3 голосов
/ 05 февраля 2011

Используйте

//*[self::A or self::B]

Выбирает все элементы в документе, которые A или B.

Обходит документ только один раз :)

2 голосов
/ 05 февраля 2011

Вы могли бы просто написать //A|//B (предыдущий, похоже, не работал, за исключением одного онлайн-тестера xpath, который научит меня доверять им).Хотя это дважды обойдёт дерево.

Ваше первоначальное выражение гласило: дайте мне все элементы (//*), у которых есть дочерний элемент с именем A или B ([A|B]), потому что, когда предикатная часть[] bit) оценивается, узел контекста совпадает с узлом, который вы исследуете, поэтому все в предикате относится к этому контексту.

2 голосов
/ 05 февраля 2011

Основываясь на ответе Welbog , я придумал такой:

.//*[name()="A" or name()="B"]

Он делает то, что предполагается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...