在 XSLT 转换的结果中出现不需要的空白有三个原因:
- 来自源文档中节点之间的空白
- 来自源文档中节点内的空格
- 来自样式表的空格
我将讨论所有这三个,因为很难分辨空白的来源,因此您可能需要使用多种策略。
要解决源文档中节点之间的空白,您应该使用<xsl:strip-space>
去除出现在两个节点之间的任何空白,然后使用<xsl:preserve-space>
保留可能出现在混合内容中的重要空白。例如,如果您的源文档如下所示:
<ul>
<li>This is an <strong>important</strong> <em>point</em></li>
</ul>
那么你会想要忽略<ul>
and 和 the之间<li>
的空白,这并不重要,但保留and元素之间的空白,这很重要(否则你会得到“这是一个**重要的** *观点*”)。为此,请使用</li>
</ul>
<strong>
<em>
<xsl:strip-space elements="*" />
<xsl:preserve-space elements="li" />
elements
on 属性<xsl:preserve-space>
基本上应该列出文档中具有混合内容的所有元素。
另外: using<xsl:strip-space>
还减少了内存中源树的大小,并使您的样式表更有效率,因此即使您没有此类空白问题,也值得这样做。
要解决源文档中节点内出现的空白,您应该使用normalize-space()
. 例如,如果您有:
<dt>
a definition
</dt>
并且您可以确定该<dt>
元素不会包含您想要使用的任何元素,那么您可以执行以下操作:
<xsl:template match="dt">
...
<xsl:value-of select="normalize-space(.)" />
...
</xsl:template>
前导和尾随空格将从<dt>
元素的值中删除,您将只得到 string "a definition"
。
要解决来自样式表的空白(这可能是您遇到的空白),是当您在模板中有这样的文本时:
<xsl:template match="name">
Name:
<xsl:value-of select="." />
</xsl:template>
XSLT 样式表的解析方式与它们处理的源文档的解析方式相同,因此上述 XSLT 被解释为一棵树,其中包含<xsl:template>
具有属性的元素,该元素match
的第一个子节点是文本节点,第二个子节点是<xsl:value-of>
具有属性的元素select
。文本节点有前导和尾随空格(包括换行符);由于它是样式表中的文字文本,因此它会被逐字复制到结果中,并带有所有前导和尾随空格。
但是XSLT 样式表中的一些空白会被自动去除,即节点之间的空白。您的结果中没有换行符,因为.<xsl:value-of>
和<xsl:template>
.
要在结果中仅获取您想要的文本,请使用如下<xsl:text>
元素:
<xsl:template match="name">
<xsl:text>Name: </xsl:text>
<xsl:value-of select="." />
</xsl:template>
XSLT 处理器将忽略出现在节点之间的换行符和缩进,并且只输出<xsl:text>
元素内的文本。