>我正在尝试清理具有任意元素名称的文件,如下所示:
<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() < 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>