Использование:
//Order/node()[not(self::text()[not(normalize-space())])]
это выбирает все дочерние узлы любого Order
элемента, за исключением тех, которые являются текстовыми узлами, состоящими полностью из белого пространства.
XSLT - на основе проверки:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<xsl:variable name="vSel1" select="//Order/node()"/>
<xsl:variable name="vSel2" select=
"//Order/node()[not(self::text()[not(normalize-space())])]"/>
<xsl:for-each select="$vSel1">
<xsl:value-of select="concat('
',position(), ': ')"/>
<xsl:copy-of select="."/>
<xsl:text>
</xsl:text>
</xsl:for-each>
================
<xsl:for-each select="$vSel2">
<xsl:value-of select="concat('
',position(), ': ')"/>
<xsl:copy-of select="."/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется на следующий документ XML:
<t>
<Order>
<a/>
<b>xxx</b>
<c/>
</Order>
<Order>
<d/>
<e>xxx</e>
<f/>
</Order>
</t>
два XPath выражения вычисляются и узлы из двух выводятся соответствующие наборы выбранных узлов, каждому из которых предшествует его номер позиции:
1:
2: <a/>
3:
4: <b>xxx</b>
5:
6: <c/>
7:
8:
9: <d/>
10:
11: <e>xxx</e>
12:
13: <f/>
14:
================
1: <a/>
2: <b>xxx</b>
3: <c/>
4: <d/>
5: <e>xxx</e>
6: <f/>
Есть ли у вас какие-либо неэлементные (текстовые) дети '', которые вы хотите сохранить? Любые узлы комментариев? (В будущем предоставление фактического тестового образца XML и выход, который вы хотите, помогут вам получить лучшие результаты.) –
Phrogz
Текст (включая пробелы) между * элементами * также являются * узлами *. То, что вы хотите найти, - это просто элементы. –