Xml Xslt只删除没有任何属性的空标记
我是xml和xslt编程和转换方面的新手。我正在编写一个xslt来删除xml文档中的空标记 我使用的xslt如下Xml Xslt只删除没有任何属性的空标记,xml,xslt,Xml,Xslt,我是xml和xslt编程和转换方面的新手。我正在编写一个xslt来删除xml文档中的空标记 我使用的xslt如下 <?xml version="1.0" encoding="UTF-16"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" /> <xsl:template m
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" />
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="*">
<xsl:if test=". != ''">
<xsl:copy>
<xsl:element name="name()">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
问题是,当我使用上述xslt转换xml文档时,包含非空属性的标记也会被删除。
例如,我想用xslt删除如下标记:
<tag1></tag1>
或
但不是
<tag1 attribute1="some value" attribute2="" ....></tag1>
您能否帮助我找到修改xslt以实现所描述行为的最佳方法
提前感谢,将您的测试更改为:
<xsl:if test=". != '' or @*">
这表示“如果节点具有内容或任何属性,则”将测试更改为:
<xsl:if test=". != '' or @*">
这表示“如果节点有内容或有任何属性,则”如果您希望删除没有属性的空节点,则我将从标识模板开始,然后创建另一个与您希望删除的这些节点匹配的模板,并且不对它们执行任何操作 这看起来像是以下XSLT:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root/node()[not(@*) and not(text() !='')]">
</xsl:template>
针对此XML运行时:
<root>
<tag1></tag1>
<tag1/>
<tag1 attribute="value"></tag1>
<tag1>value</tag1>
</root>
价值
创建此输出:
<root>
<tag1 attribute="value"/>
<tag1>value</tag1>
</root>
价值
如果您希望删除没有属性的空节点,那么我将从标识模板开始,然后创建另一个与您要删除的这些节点匹配的模板,而不对它们执行任何操作
这看起来像是以下XSLT:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root/node()[not(@*) and not(text() !='')]">
</xsl:template>
针对此XML运行时:
<root>
<tag1></tag1>
<tag1/>
<tag1 attribute="value"></tag1>
<tag1>value</tag1>
</root>
价值
创建此输出:
<root>
<tag1 attribute="value"/>
<tag1>value</tag1>
</root>
价值