В следующем 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 элементы, которые содержат:
- привет суб-элементы, разрывать атрибут содержит слово «жирный»
- текста нет собственного
- ничего
Это должно означать, что я получаю только абзацы, конкатенированное содержимое которых является hi-тегами с атрибутом rend, содержащим «жирный шрифт».
Я пробовал различные подходы. Ближайший кажется:
//p[hi[contains(@rend, "bold")] and not(text()) and not(*[not(self::hi[contains(@rend, "bold")])])]
Однако нет (текст()) аспект не работает, как хотелось бы. Строка с текстом внутри самого тега P (условие № 2 выше) не выполняется.
Я попытался, как и другие условия:
- нет (* [предок :: текст()])
- нет (родитель :: текст())
и несколько другие.
Любая помощь будет высоко оценена. Я использую XSLT 1.0.
Большое спасибо: это блестящий. –
Я думаю, что это также работает, просто немного изменив последнее условие: 'p [count (hi) = count (hi [contains (@rend, 'bold')]) и не (normalize-space (text()))] ' –
Нет, это не сработает. text() выбирает набор узлов, а normalize-space() принимает строку как параметр. Таким образом, XPath преобразует набор узлов в строку с помощью функции string(), и эта функция возвращает строковое значение узла в наборе узлов, которое является первым в порядке документа. См. Http://www.w3.org/TR/xpath/#section-String-Functions – Erlock