Используйте это выражение XPath :
/*/*/X/node()
. Выбирает любой узел (элемент, текстовый узел, комментарий или инструкцию обработки), который является дочерним по отношению к любому элементу X
, который являетсяпотомок верхнего элемента XML-документа.
Чтобы проверить, что выбрано , вот преобразование XSLT, которое выводит именно выбранные узлы:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:copy-of select="/*/*/X/node()"/>
</xsl:template>
</xsl:stylesheet>
, и он дает именно нужный, правильный результат:
First Text Node #1
<y> Y can Have Child Nodes #
<child> deep to it </child>
</y> Second Text Node #2
<z />
Объяснение :
Как определено в W3 XPath 1.0 Spec, «child::node()
выбирает все дочерние элементы узла контекста, независимо от их типа узла».Это означает, что этот элемент теста выбирает любой элемент, текстовый узел, узел комментария и узел инструкции обработки.
node()
- это сокращение child::node()
(потому что child::
является основной осью и используется, когда ось явно не указана).