Поиск…


Найти все элементы с определенным текстом

Представьте следующий XML:

<root>
    <element>hello</element>
    <another>
        hello
    </another>
    <example>Hello, <nested> I am an example </nested>.</example>
</root>

Следующее выражение XPath:

//*[text() = 'hello']

вернет <element>hello</element> , но не элемент <another> . Это связано с тем, что элемент <another> содержит пробелы, окружающие hello текст.

Чтобы получить как <element> и <another> , можно использовать:

//*[normalize-space(text()) = 'hello']

или же

//*[normalize-space() = 'hello']

который будет обрезать окружающие пробелы перед выполнением сравнения. Здесь мы видим, что спецификатор узла text() является необязательным при использовании normalize-space .

Чтобы найти элемент, содержащий конкретный текст, вы можете использовать функцию contains . Следующее выражение вернет элемент <example> :

//example[contains(text(), 'Hello')]

Если вы хотите найти текст, охватывающий несколько дочерних / текстовых узлов, то вы можете использовать . вместо text() . . относится ко всему текстовому содержимому элемента и его дочерним элементам.

//example[. = 'Hello,  I am an example .']

Чтобы увидеть несколько текстовых узлов, вы можете использовать:

//example//text()

который вернется:

  • "Привет, "
  • «Я - пример»
  • ""

И чтобы более четко увидеть весь текстовый контент элемента, можно использовать string функцию:

string(//example[1])

или просто

string(//example)

Привет, я пример.

Последнее работает, потому что, если набор узлов передается в такие функции, как string , XPath 1.0 просто смотрит на первый узел (в порядке документа) в этом наборе узлов и игнорирует остальные.

так:

string(/root/*)

вернется:

Привет



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow