我正在使用XSLT在XML文档中进行非常简单的转换。我只想删除具有特定名称的所有元素节点。 碰巧在我的源文档中,所有这些节点都位于文档的末尾,但是在转换之后,虽然节点已经按照我的意图消失了,但是它们的位置有很多空行。
这完全是一个美容问题,因为我完成了我想要的改造,但出于好奇:我怎么能摆脱这些空行? 这是我用于转换的XSL文件(我想删除的元素名为“relations”):
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="relation"/>
</xsl:stylesheet>
答案 0 :(得分:26)
原因在于仅限空格的文本节点是已删除元素的直接兄弟节点。
解决方案:只需添加此XSLT指令即可删除任何仅限空格的文本节点 - 甚至在转换开始之前:
<xsl:strip-space elements="*"/>
结果可能会丢失缩进 - 如果是这样,请添加:
<xsl:output omit-xml-declaration="yes" indent="yes"/>
完整转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="relation"/>
</xsl:stylesheet>
应用于此XML文档(未提供!):
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
<relation/>
<relation/>
<relation/>
<relation/>
<relation/>
<relation/>
<relation/>
<relation/>
</nums>
产生了想要的,正确的结果(没有尾随空格):
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>