防止XSLT输出中出现窄的非中断空间(n-nbsp)



我有一个XSLT转换,它将 放入我的输出中。这是一个狭窄而不可突破的空间。以下是导致nnbsp的一个部分:

<span>
<xsl:text>§ </xsl:text>
<xsl:value-of select="$firstsection"/>
<xsl:text> to </xsl:text>
<xsl:value-of select="$lastsection"/>
</span>        

在这种情况下,nnbsp出现在§和文本to之后。

<span>§&#x202f;1 to&#x202f;8</span>

(有趣的是,to之前的空间原来是一个规则的全尺寸空间)

这发生在我的UTF-8编码输出中,以及iso-8859-1(latin1)中。

如何避免nnbsp?虽然狭窄的空间在视觉上更合适,但它并不适用于所有将阅读此文档的设备。我需要一个普通的空白处。

有变换设置吗?我在命令行使用Saxon 9。

我应该再做一次变换吗。。使用替换模板替换nnnbsp?

我应该像上面那样重新制作我的模板吗?例如,如果我做了一个concat(),那会是一个更好的编码实践吗?

更新:对于那些有朝一日可能会发现这个问题的人。。。正如迈克尔·凯所建议的那样,我进一步研究了这个问题。事实证明,窄NBSP在源XML文件中(并通过剪切/粘贴渗透到我的模板中)。我不知道这一点,很难发现(gVim十六进制视图的提示)。在GUI编辑器中,窄条并不会完全针对您。我无法控制源XML的生成,所以我必须找到一种"处理它"的方法。下面Eric的回答是我最喜欢的清除nbsp的方法。SED编辑过去是(现在也是)另一个需要考虑的选项,但我喜欢尽可能将我的产品保持在XSLT中。所以孙的建议对我来说效果很好

您可以使用translate()函数将nnbsp替换为其他函数,但由于您使用的是Saxon 9,因此您可以依赖XSLT2.0功能并使用字符映射,例如,该映射将自动为您执行此类操作(假设您想用一个不间断的空格替换它们:

<xsl:output use-character-maps="nnbsp"/>
<xsl:character-map name="nnbsp">
<xsl:output-character character="&#x202f;" string="&#xa0;"/>   
</xsl:character-map>

Eric

狭窄的非中断空间来自某个地方:源文档或样式表。XSLT处理器并没有神奇地注入它。如果它在样式表中,那么就把它去掉。如果它在源文档中,那么把它转换掉,例如使用translate()函数。

事实上,将代码片段粘贴到文本编辑器中,并用十六进制进行查看,我发现202F字符就在代码中。我不知道你是如何将它们放入样式表的,但你应该(a)删除它们,(b)弄清楚它是如何发生的,这样就不会再发生了。

最新更新