我正在尝试从源XML中删除空节点。删除空节点已经成功。但我也尝试删除包含空节点的所有节点。
源XML:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<element>
<a></a>
<b>sde</b>
<c fixedAttr="fixedValue">
<d>ert</d>
<e></e>
</c>
<f fixedAttr="fixedValue">
<g></g>
<h></h>
<i></i>
</f>
</element>
</data>
当前的XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>
当前结果:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<element>
<b>sde</b>
<c fixedAttr="fixedValue">
<d>ert</d>
</c>
<f fixedAttr="fixedValue"/>
</element>
</data>
通缉结果:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<element>
<b>sde</b>
<c fixedAttr="fixedValue">
<d>ert</d>
</c>
</element>
</data>
空父节点<f fixedAttr="fixedValue"/>
也需要删除。
答案 0 :(得分:2)
我没有对它进行过多次测试,但是xslt似乎正在运行。
<xsl:template match="node()|@*">
<xsl:if test="normalize-space(string(.)) != ''">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:if>
</xsl:template>
编辑: 如果你想保留空属性,可以用它完成
<xsl:template match="node()[normalize-space(string(.)) != '']|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
答案 1 :(得分:2)
删除模板中忽略(视为空)的节点父节点:
<xsl:template match="*[not(@*|* |comment()|processing-instruction()) and normalize-space()='']"/>
添加新模板:
<xsl:template match="*[ * and not(*[ @* or * or comment() or processing-instruction() or normalize-space()!='']) ]"/>
仅锁定输入中有子节点但输出中没有子节点的节点。