我在XML中有以下输出,我在从内容中删除无用标签时遇到问题。我有以下XML值:
<Site EntityType="2" Identifier="CL">
<Name Last="Rai"/>
<Address/>
<Contacts>
<Contact>
<Number/>
</Contact>
</Contacts>
</Site>
我的问题是如何使用XSLT从上面的XML中删除无用的标签?
欲望输出是这样的:
<Site EntityType="2" Identifier="CL">
<Name Last="Rai"/>
</Site>
在上面的输入<Address/>
中,<Contacts>...</Contacts>
毫无意义,因此我们删除了这些内容。
答案 0 :(得分:2)
在这种情况下,您应该从身份模板开始,该模板将复制所有现有节点和属性
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
这意味着您只需要为要删除的节点编写模板。带你定义&#34;无用的&#34; as&#34;没有后代文本节点(或处理指令)的元素,没有属性,没有属性&#34;的后代元素,那么模板匹配你喜欢这个
<xsl:template match="*[not(descendant-or-self::*/@*|descendant::text()[normalize-space()]|descendant::processing-instruction())]" />
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(descendant-or-self::*/@*|descendant::text()[normalize-space()]|descendant::processing-instruction())]" />
</xsl:stylesheet>
或者,如果您使用xsl:strip-space
,则可以稍微调整一下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(descendant-or-self::*/@*|descendant::text()|descendant::processing-instruction())]" />
</xsl:stylesheet>