XPath / XQuery: поиск текста в узле, но игнорирование содержимого определенных элементов-потомков - PullRequest
12 голосов
/ 19 января 2011

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

Например,

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

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

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

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

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

Ответы [ 4 ]

14 голосов
/ 19 января 2011

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

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

Используйте :

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

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

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

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

My text starts here/
4 голосов
/ 19 января 2011
//p[(.//text() except .//footnote//text())[contains(., 'text')]]
1 голос
/ 19 января 2011

/document/p[text()[contains(., 'text')]] должен сделать.

0 голосов
/ 19 января 2011

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

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