我有一个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>§ 1 to 8</span>
(有趣的是,to
之前的空间变成了常规的全尺寸空间)
这发生在我的UTF-8编码输出以及iso-8859-1(latin1)中。
我该如何避免nnbsp?虽然狭窄的空间在视觉上更合适,但它并不适用于阅读本文档的所有设备。我需要一个普通的香草空白区域。
是否有变换设置?我在命令行使用Saxon 9。
我应该进行另一次转换..使用替换模板替换nnbsp?
我应该像上面那样重新制作模板吗?例如,如果我做了concat()
那会是一个更好的编码实践吗?
更新:对于那些可能有一天会发现这个问题的人......正如Michael Kay所说,我进一步研究了这个问题。事实上,事实证明,狭窄的NBSP在源XML文件中(并通过剪切/粘贴渗入我的模板)。我不知道这一点,很难发现(给gVim十六进制视图提示)。在GUI编辑器中,缩小并没有完全跳出来。我无法控制源XML的生成,所以我必须找到一种“处理它”的方法。埃里克在下面的回答证明是我首选的方法来擦洗狭窄的。 SED编辑是(并且是)另一个需要考虑的选项,但我喜欢在可能的情况下将我的生产保留在XSLT中。所以Eric的建议对我有用。
答案 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=" " string=" "/>
</xsl:character-map>
埃里克
答案 1 :(得分:1)
狭窄的不间断空间来自某个地方:源文档或样式表。它并没有被XSLT处理器神奇地注入。如果它在样式表中,那么就摆脱它。如果它在源文档中,则将其转换掉,例如使用translate()函数。
事实上,将代码片段粘贴到文本编辑器中并以十六进制格式查看,我发现代码中的202F字符就在那里。我不知道你是如何将它们放入样式表中的,但你应该(a)删除它们,然后(b)弄清楚它是如何发生的,这样就不会再发生了。