Причина опубликования этого ответа:
что вы не приняли ни одного из
существующих ответов пока нет.
Хорошо. Это очень простая задача XSLT. Просто сопоставьте узел с текстовыми данными как ноль и закройте тег шаблона, чтобы узел не отображался в выходных данных.
вот так, <xsl:template match=*[.='']/>
добавьте его вместе с вашим шаблоном идентификации. Подобно тому, как Томолак прибил.
Проблема с этим подходом заключается в том, что он удаляет даже ваш родительский узел (например, тег <Person/>
), если он равен нулю.
Если это ваш xml:
<Persons>
<Person>
<data>text</data>
<data2>text</data2>
<data3/>
</Person>
<Person/>
</Persons>
Из приведенного выше xml даже тег удаляется. Таким образом, выходной XML будет:
<Persons>
<Person>
<data>text</data>
<data2>text</data2>
</Person>
</Persons>
Если вы хотите избежать этого, добавьте исключение.
<xsl:template match="*[name()!='Person' and not(node())]"/>
Добавьте свой шаблон личности. Ваш XSLT будет:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[name()!='Person' and not(node())]"/>
</xsl:stylesheet>
И выходной xml будет:
<Persons>
<Person>
<data>text</data>
<data2>text</data2>
</Person>
<Person/>
</Persons>