我是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 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\>
但不是
<tag1 attribute1="some value" attribute2="" ....></tag1>
您能帮我找到修改xslt的最佳方法,以实现所描述的行为吗?
提前致谢,
答案 0 :(得分:1)
将测试更改为:
<xsl:if test=". != '' or @*">
这说“如果节点有内容或者它有任何属性,那么”
答案 1 :(得分:0)
如果您要删除没有属性的空节点,那么我将从身份模板开始,然后创建另一个与您想要删除的节点匹配的模板,并且不对它们执行任何操作。
所以看起来像下面的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>