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.
Любая помощь будет высоко оценена:)
Ответы
Ответ 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")]