Выбор подмножества XPath - PullRequest
       1

Выбор подмножества XPath

4 голосов
/ 28 августа 2010

У меня есть следующий XML (который на самом деле HTML):

<html>
    <h4>something</h4>
    <p>a</p>
    <p>b</p>
    <h4>otherthing</h4>
    <p>c</p>
</html>

Может ли XPath выбрать узлы "p", которые следуют за братьями и сестрами первого узла "h4", но не следуют за братьями и сестрами второго узла "h4" (выбирая только узлы "p" a & b)?

Ответы [ 3 ]

4 голосов
/ 28 августа 2010

Мой дубль

//p[preceding-sibling::h4[1] and not(preceding-sibling::h4[position() > 1])]

находит все p элементов, которые являются родными элементами первого h4, но не являются родными элементами любого другого h4 на той же оси

Альтернатива

//h4[1]/following-sibling::p[count(preceding-sibling::h4) = 1]

находит все последующие элементы p первого элемента h4, которые имеют ровно один предшествующий элемент h4

3 голосов
/ 28 августа 2010

Используйте

/*/h4[1]/following-sibling::p
            [not(count(preceding-sibling::* | /*/h4[2])
                =
                 count(preceding-sibling::*)
                 )
             ]

В более общем смысле пересечение двух наборов узлов $ns1 и $ns2 имеет значение , выбранное посредством:

$ns1[count(.|$ns2) = count($ns2)]

Тот факт, что узел $ n не входит в набор узлов $ ns1, выражается :

not(count($n | $ns1) = count($ns1))

Это фундаментальная теория множеств и использование стандартного XPath | (оператор объединения и not() функция.

1 голос
/ 28 августа 2010

Предположим, нет <p> предшествующего первому <h4>,

//h4[2]/preceding-sibling::p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...