2014-01-27 1 views
1

В следующем XML:XPath: возвращает узлы с конкретными детьми, но не текст собственного

<document> 
<p rend="Default Style"><hi rend="bold italic">This one</hi></p> 
<p rend="Default Style"><hi rend="bold italic">Not this one</hi> please</p> 
<p rend="Default Style"><hi rend="italic">Not this one either</hi></p> 
<p rend="Default Style"><hi rend="bold">Not this one either</hi><hi rend="italic">Not this one either because it has others</hi></p> 
<p rend="Default Style"><hi rend="bold italic">This one</hi> <hi rend="bold italic">because it is all bold</hi></p> 
</document> 

Я хотел бы, чтобы выбрать P элементы, которые содержат:

  1. привет суб-элементы, разрывать атрибут содержит слово «жирный»
  2. текста нет собственного
  3. ничего

Это должно означать, что я получаю только абзацы, конкатенированное содержимое которых является hi-тегами с атрибутом rend, содержащим «жирный шрифт».

Я пробовал различные подходы. Ближайший кажется:

//p[hi[contains(@rend, "bold")] and not(text()) and not(*[not(self::hi[contains(@rend, "bold")])])] 

Однако нет (текст()) аспект не работает, как хотелось бы. Строка с текстом внутри самого тега P (условие № 2 выше) не выполняется.

Я попытался, как и другие условия:

  • нет (* [предок :: текст()])
  • нет (родитель :: текст())

и несколько другие.

Любая помощь будет высоко оценена. Я использую XSLT 1.0.

ответ

3

Пространства между элементами hi являются допустимыми текстовыми узлами. Используйте normalize-space() для их фильтрации.

p[count(hi) = count(hi[contains(@rend, 'bold')]) and not(text()[normalize-space()!=''])] 
+0

Большое спасибо: это блестящий. –

+0

Я думаю, что это также работает, просто немного изменив последнее условие: 'p [count (hi) = count (hi [contains (@rend, 'bold')]) и не (normalize-space (text()))] ' –

+0

Нет, это не сработает. text() выбирает набор узлов, а normalize-space() принимает строку как параметр. Таким образом, XPath преобразует набор узлов в строку с помощью функции string(), и эта функция возвращает строковое значение узла в наборе узлов, которое является первым в порядке документа. См. Http://www.w3.org/TR/xpath/#section-String-Functions – Erlock

Смежные вопросы