Что эта строка из исходного кода (я немного изменил его, так как вы не можете иметь ]
появляться в середине предиката):
<xsl:apply-templates select="*[not(self::one or self::two) and not(node())] "/>
делает, на простом английском языке:
Применение шаблонов для элементов, но только если они не являются one
элементов, или если они не являются элементами two
и только если они не содержат дочерний узел.
Но, конечно, вы хотели бы выбрать точную противоположность, то есть элементы, содержащие текст.
На мой взгляд, использование разных шаблонов для этой задачи было бы более чистым решением.
стилевых
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!--Traverse the Row element-->
<xsl:template match="Row">
<xsl:apply-templates />
</xsl:template>
<!--Do not apply templates to one, two or empty elements-->
<xsl:template match="Row/*[self::one or self::two or not(text())]"/>
</xsl:stylesheet>
XML Output
Обратите внимание, что вы не выводит хорошо сформированный XML-документ. Но это был бы действительный XML фрагмент.
<tree>3</tree>
<four>4</four>
Как это группирование непустых элементов? Элементы 'one' и' two' также содержат текст, но не отображаются в ожидаемом выводе. –
Я хочу получить все непустые элементы, а не один и два. поэтому мы уехали с деревом и четырьмя – lshaked