XPath содержит (текст (), «некоторая строка») не работает при использовании с узлом с более чем одним текстовым подзоном

У меня есть небольшая проблема с Xpath содержит с dom4j

Допустим, мой XML

  ABC 5 BLAH BLAH BLAH 

ABC

Допустим, я хочу найти все узлы с ABC в тексте с учетом элемента Element …

Итак, xpath, который мне нужно было бы написать, будет

//*[contains(text(),'ABC')]

Однако это не то, что возвращает Dom4j …. это проблема dom4j или мое понимание того, как работает xpath. поскольку этот запрос возвращает только элемент Street Element, а не элемент Comment.

DOM делает элемент Comment составным элементом с четырьмя двумя тэгами

 [Text = 'XYZ'][BR][BR][Text = 'ABC'] 

Я бы предположил, что запрос все равно должен вернуть элемент, так как он должен найти элемент и запустить его, но он не …

следующий запрос возвращает элемент, но он возвращает гораздо больше, чем просто элемент, он также возвращает родительские элементы … что нежелательно для проблемы …

 //*[contains(text(),'ABC')] 

Кто-нибудь знает запрос xpath, который возвращает только Элементы и ?

Тег содержит два текстовых узла и два узла в качестве дочерних элементов.

Ваше выражение xpath было

 //*[contains(text(),'ABC')] 

Чтобы сломать это,

  1. * – селектор, который соответствует любому элементу (т.е. тегу) – он возвращает набор узлов.
  2. [] – это условие, которое работает на каждом отдельном узле в этом наборе узлов. Он соответствует, если какой-либо из отдельных узлов, с которыми он работает, соответствует условиям внутри скобок.
  3. text() – это селектор, который соответствует всем текстовым узлам, являющимся дочерними узлами контекстного узла, – возвращает набор узлов.
  4. contains – это функция, которая работает с строкой. Если ему передан набор узлов, набор узлов преобразуется в строку, возвращая строковое значение узла в наборе узлов, которое является первым в порядке документа . Следовательно, он может соответствовать только первому текстовому узлу в вашем элементе а именно BLAH BLAH BLAH . Поскольку это не соответствует, вы не получаете в своих результатах.

Вы должны изменить это на

 //*[text()[contains(.,'ABC')]] 
  1. * – селектор, который соответствует любому элементу (т.е. тегу) – он возвращает набор узлов.
  2. Внешний [] является условным, который работает на каждом отдельном узле в этом наборе узлов – здесь он работает с каждым элементом документа.
  3. text() – это селектор, который соответствует всем текстовым узлам, являющимся дочерними узлами контекстного узла, – возвращает набор узлов.
  4. Внутренний [] является условным, который работает на каждом узле в этом наборе узлов – здесь каждый отдельный текстовый узел. Каждый отдельный текстовый узел является отправной точкой для любого пути в скобках и также может быть явно указан как . в скобках. Он соответствует, если какой-либо из отдельных узлов, с которыми он работает, соответствует условиям внутри скобок.
  5. contains – это функция, которая работает с строкой. Здесь он передается отдельным текстовым узлом ( . ). Поскольку он передается вторым текстовым узлом в отдельно, он увидит строку 'ABC' и сможет ее сопоставить.

[contains(text(),'')] возвращает только true или false. Он не будет возвращать результаты каких-либо элементов.

  • Как передать параметр переменной в выражение XPath?
  • Существует ли XSLT-элемент?
  • XPath: выберите всех следующих братьев и сестер, пока другой брат
  • Извлечение значения узла атрибута через XPath
  • Получение имени элемента в XPATH
  • Оператор XPath OR для разных узлов
  • Как преобразовать строку в верхний или нижний регистр с помощью XSLT?
  • Xml пространство имен, разбивающее мой xpath!
  • Как использовать «не» в xpath?
  • XPath в XML-документе с пространством имен
  • Строка XSLT заменяет
  • Давайте будем гением компьютера.