Xslt仅删除没有任何属性的空标记

时间:2013-11-18 22:08:21

标签: 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 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的最佳方法,以实现所描述的行为吗?

提前致谢,

2 个答案:

答案 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>