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

时间:2014-01-08 11:00:24

标签: xslt encoding

我有一个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。

我应该进行另一次转换..使用替换模板替换nnbsp?

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

更新:对于那些可能有一天会发现这个问题的人......正如Michael Kay所说,我进一步研究了这个问题。事实上,事实证明,狭窄的NBSP在源XML文件中(并通过剪切/粘贴渗入我的模板)。我不知道这一点,很难发现(给gVim十六进制视图提示)。在GUI编辑器中,缩小并没有完全跳出来。我无法控制源XML的生成,所以我必须找到一种“处理它”的方法。埃里克在下面的回答证明是我首选的方法来擦洗狭窄的。 SED编辑是(并且是)另一个需要考虑的选项,但我喜欢在可能的情况下将我的生产保留在XSLT中。所以Eric的建议对我有用。

2 个答案:

答案 0 :(得分:2)

您可以使用translate() function替换您的nnbsp,但由于您使用的是Saxon 9,因此您可以依赖XSLT 2.0功能并使用character map来执行此操作例如,(例如,假设你想用一个不间断的空间替换它们:

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

埃里克

答案 1 :(得分:1)

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

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