我正在编写一个XSLT过滤器,它读取一个 XML 文件,并生成一个较短的 XML 文件,其中删除了一些选定的元素(及其所有子元素)。
到目前为止,我的过滤器给我的输出是有效的、格式良好的 XML,但它在删除元素的位置有空行。形式上,我认为删除元素之前的文本节点仍然存在,导致空行。我想删除这个空白行,但保留所有其他缩进。我怎样才能做到这一点?
我的 XSLT 过滤器的简化版本是:
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes" encoding="utf-8" />
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="root/maybe[remove]" />
</xsl:stylesheet>
我的输入 XML 文件的一个非常简化的版本是:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<maybe><keep /></maybe>
<maybe><remove/></maybe>
</root>
是的,缩进是非标准的。我试图表明我希望过滤器留下它找到的缩进,除了它删除的元素。这让我可以使用传统的diff确认结果。
我现在得到的输出(在 MacOS X 10.10 上使用xsltproc
from libxslt
):
<?xml version="1.0" encoding="utf-8"?>
<root>
<maybe><keep/></maybe>
</root>
<keep/>
和之间的空白行</root>
是我要消除的。
现在,在 SO 的其他地方,相关问题XSLT:如何防止 XSLT 代码在输出 xml 中生成冗余空白和删除 XSLT 中的空白行建议将xsl:strip-space添加到 XSLT 过滤器:
<xsl:strip-space elements="*"/>
当我尝试这样做时,输出文件不再有空行,但它现在具有与原始文件不同的缩进:
<?xml version="1.0" encoding="utf-8"?>
<root>
<maybe>
<keep/>
</maybe>
</root>
(请注意,<maybe>
and<keep/>
和</maybe>
现在位于不同的行,并且缩进不同。)
那么,是否有一个 XSLT 元素会连同元素一起删除空行,但保留其他缩进和换行符?
此外,我的真实文件来自GnuCash,并且具有更复杂的结构。我真正的 XSLT 过滤器有一个更复杂的匹配表达式。因此,首选不需要我重复匹配表达式的 XSLT 元素。
<xsl:template match='gnc-v2//gnc:account[@version="2.0.0"]/act:slots/
slot[slot:key/text()="import-map-bayes"]/slot:value[@type="frame"]/
slot/slot:value[@type="frame"]/slot[starts-with(slot:key/text(),
"Assets, Business, CAD:"
)]' />
此外,一个相关的问题Removing extra blank lines with XSLT, without using indentation没有答案。那里没有洞察力。
我正在使用 XSLT 1.0,因为这是我的工具所支持的。XSLT 2.0 是否为这个问题提供了更好的答案?
更新:稍微简化了匹配模式,提到了 XSLT 1 vs 2。