2014-01-08 40 views
1

我有一个XSLT转换,将 放入我的输出中。这是一个狭窄的非破坏性空间。这是一款导致nnbsp:在XSLT输出中防止缩小非打破空间(n-nbsp)

<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()那会不会是更好的编码习惯?

更新:对于那些谁可能有一天会发现这个问题......正如迈克尔凯建议,我进一步研究了这个问题。实际上,事实证明窄NBSP在源XML文件中(并通过剪切/粘贴流入我的模板中)。我不知道这一点,很难发现(帽子提示gVim十六进制视图)。在GUI编辑器中,缩小并不会完全跳出你的身影。我无法控制源XML的生产,所以我不得不找到一种“处理它”的方法。下面Eric的回答证明是我的首选方式,可以磨合窄带。 SED编辑是(也是)需要考虑的另一种选择,但我希望尽可能将我的产品保留在XSLT中。所以埃里克的建议对我来说效果很好。

+0

我不明白为什么你应该在那里得到那个角色,如果它不在你输出的样式表文本或你输出的变量中。 –

+0

我同意马丁..但它正在发生。 – Paulb

回答

2

您可以使用translate() function用别的东西来代替你的nnbsp,但因为使用的是撒克逊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> 

埃里克

+0

谢谢埃里克。像魅力一样工作......我学到了新的东西。 – Paulb

1

狭窄的非换空间是从什么地方来了:要么源文件或样式表中它没有被奇迹般地注入XSLT处理器。如果它在样式表中,那么ge摆脱它。如果它在源文档中,则转换它,例如通过使用translate()函数。

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

+0

我明白了。埃里克的回答(输出字符)修复了它。但我仍然会研究它,因为我应该知道为什么创建了nnbsp。 – Paulb

+0

也许你的文本编辑器是“自动纠正”的空间变成狭窄的非破坏性空间在'<'强制一些印刷惯例! –