Подтвердить что ты не робот

XPath/XQuery: найдите текст в node, но игнорируя содержимое определенных элементов-потомков

Я пытаюсь найти способ поиска строки в узлах, но исключая содержимое некоторых подэлементов этих узлов. Просто и просто, я хочу найти строку в параграфах текста, исключая сноски, которые являются дочерними элементами абзацев.

Например,

Мой документ:

<document>
   <p n="1">My text starts here/</p>
   <p n="2">Then it goes on there<footnote>It not a very long text!</footnote></p>
</document>

Когда я ищу "текст", я хотел бы, чтобы Xpath / XQuery извлекал первый элемент p, но не второй (где "текст" содержится только в подэлементе сноски).

Я попробовал функцию contains(), но он извлекает оба элемента p.

Любая помощь будет высоко оценена:)

4b9b3361

Ответ 1

Я хочу найти строку в абзацы текста, за исключением сноски, которые являются элементами детей пунктов

Решение XPath 1.0 - только:

Использование

//p//text()[not(ancestor::footnote) and contains(.,'text')]

Против следующего XML-документа (полученного из вашего, но добавленного p внутри footnote, чтобы сделать это более интересным):

<document>
    <p n="1">My text starts here/</p>
    <p n="2">Then it goes on there
        <footnote>It not a very long text!
           <p>text</p>
        </footnote>
    </p>
</document>

это выражение XPath выбирает именно требуемый текст node:

My text starts here/

Ответ 2

//p[(.//text() except .//footnote//text())[contains(., 'text')]]

Ответ 3

/document/p[text()[contains(., 'text')]].

Ответ 4

Для записи в качестве дополнения к другим ответам я нашел это обходное решение, которое также, похоже, выполняет эту работу:

//p[contains(child::text()|not(descendant::footnote), "text")]