递归空节点清理



>我正在尝试清理具有任意元素名称的文件,如下所示:

<root>
    <nodeone>
        <subnode>with stuff</subnode>
    </nodeone>
    <nodeone>
        <subnode>with other stuff</subnode>
    </nodeone>
    <nodeone>
        <subnode />
    </nodeone>
</root>

放入如下所示的文件中:

<root>
    <nodeone>
        <subnode>with stuff</subnode>
    </nodeone>
    <nodeone>
        <subnode>with other stuff</subnode>
    </nodeone>
</root>

你可以看到,所有有空子项的"nodeone"都消失了。我使用了一种解决方案,可以删除空<subnode>,但保留<nodeone>。所需的结果是删除这两个元素。

我目前对解决方案的尝试(完全没有做任何事情)是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>
    <xsl:template match="node()|@*">
        <xsl:call-template name="backwardsRecursion">
            <xsl:with-param name="elementlist" select="/*/node/*[normalize-space()]"/>
        </xsl:call-template>
    </xsl:template>
    <xsl:template name="backwardsRecursion">
        <xsl:param name="elementlist"/>
        <xsl:if test="$elementlist">
            <xsl:apply-templates select="$elementlist[last()]"/>
            <xsl:call-template name="backwardsRecursion">
                <xsl:with-param name="elementlist" select="$elementlist[position() &lt; last()]"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    <xsl:template match="/*/node/*[normalize-space()]">
          <xsl:value-of select="."/>
    </xsl:template>
</xsl:stylesheet>

XSLT 不是我经常使用的东西,所以我有点迷茫。

从身份转换开始,

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

并添加一个模板来静噪没有显着、非空格规范化字符串值的元素,

  <xsl:template match="*[not(normalize-space())]"/>

你会得到你想要的结果。

完全:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="*[not(normalize-space())]"/>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新