【问题标题】:Prevent Narrow Non-Breaking Space (n-nbsp) in XSLT output防止 XSLT 输出中出现狭窄的不间断空格 (n-nbsp)
【发布时间】:2014-01-26 10:28:14
【问题描述】:

我有一个 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 的建议,我进一步研究了这个问题。事实上,narrow-NBSP 是在源 XML 文件中(并通过剪切/粘贴流入我的模板)。我不知道这一点,而且很难发现(gVim 十六进制视图的提示)。在 GUI 编辑器中,狭窄并没有完全跳出来。我无法控制源 XML 的生成,所以我必须找到一种方法来“处理它”。事实证明,埃里克在下面的回答是我擦洗nbsp的首选方式。 SED 编辑曾经(并且现在)是另一个需要考虑的选项,但我喜欢尽可能将我的作品保留在 XSLT 中。所以 Eric 的建议对我很有效。

【问题讨论】:

  • 如果它不在您输出的样式表文本或您输出的变量中,我不明白为什么您应该在其中获取该字符。
  • 我同意 Martin.. 但它正在发生。

标签: xslt encoding


【解决方案1】:

您可以使用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>

埃里克

【讨论】:

  • 谢谢埃里克。工作就像一个魅力......我学到了一些新东西。
【解决方案2】:

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

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

【讨论】:

  • 我明白了。埃里克的回答(输出字符)修复了它。但我还是会研究它,因为我应该知道为什么要创建 nnbsp。
  • 也许你的文本编辑器在 &lt; 之前将空格“自动更正”成狭窄的不间断空格,以强制进行一些排版约定!
猜你喜欢
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2016-02-20
  • 1970-01-01
相关资源
最近更新 更多