Как выбрать теги с XPATH на основе их реляционной позиции? - PullRequest
1 голос
/ 15 января 2020

Я новичок в XPATH и пытаюсь понять, как выбрать теги из следующего кода:

                                <content>
                                    <par>
                                        <include.text>
                                            <RefControl/>
                                        </include.text>
                                        <linebreak/>
                                        <include.text>
                                            <RefControl/>
                                        </include.text>
                                        <linebreak/>
                                        <include.text>
                                            <RefControl/>
                                        </include.text>
                                        <linebreak/>
                                        <include.text>
                                            <RefControl/>
                                        </include.text>, T3C</par>
                                </content>

Я могу выбрать первый тег <include.text>, используя следующий XPATH: //include.text[not(preceding-sibling::node())].

Я согласен с этим (мне нужно, чтобы он отличался от <include.text> тегов, которые по-разному используются в XML).

Итак, какие выражения XPATH мне нужны:

1) Выражение XPATH, которое выбирает тег <linebreak> НЕ на основе <par> (в данном случае), а на основе непосредственно следующего <include.text>. Я бы подумал что-то вроде этого: //include.text/preceding-sibling::linebreak, но это не работает.

2) Выражение XPATH, которое выбирает теги <include.text>, которые НЕ следуют сразу за <par>. Я не могу использовать «нет предшествующих братьев и сестер» (как указано выше), потому что есть предшествующие братья и сестры. Мне по-прежнему необходимо различать ВСЕ <include.text> теги, используемые в разных позициях в XML, однако (поэтому также нет //include.text).

Примечание: <par> является произвольным (это может быть другим именем тега тоже), поэтому я не могу использовать его в XPATH.

Надеюсь, я четко объяснил это. Спасибо за любую помощь!

1 Ответ

2 голосов
/ 15 января 2020

XPath для

  1. Выбор всех linebreak элементов, чей непосредственный предшествующий элемент равен include.text:

    //linebreak[preceding-sibling::*[1][self::include.text]]
    
  2. Выбор include.text элементов на основе их родственной позиции:

    //par/include.text[1] выбирает первого include.text родного брата par родителя.

    //include.text[1] выбирает первого include.text Брат или сестра, независимо от наследия.

    //include.text[not(preceding-sibling::*)] выбирает include.text, только если нет никаких предыдущих узлов.

    //include.text[not(preceding-sibling::node())] выбирает include.text, только если предыдущих элементов нет.

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