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和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 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>

价值