如何改造& NBSP;在XSLT中

时间:2011-11-24 13:18:57

标签: html xslt cdata

我有以下xslt:

<span><xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;Some text]]></xsl:text></span>

转化后,我得到:

<span>&amp;nbsp;Some text</span>

呈现为:&amp;一些文字

我想渲染&amp; NBSP;作为空间角色。我已经尝试过将disable-output-escaping改为no,但它没有帮助。

感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

另外两个答案是正确的,但我决定对这个问题采取更广泛的看法。

每个人都应该了解CDATA部分

CDATA部分只是转义的XML字符串的替代序列化表单。这意味着解析器会为<span><![CDATA[ a & b < 2 ]]></span><span> a &amp; b &lt; 2 </span>生成相同的结果。 XML应用程序处理解析的数据,因此XML应用程序应为两个示例输入元素生成相同的输出。

简要说明:CDATA部分内的转义数据和未转义数据的含义完全相同。

在这种情况下

<span><xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;Some text]]></xsl:text></span>

相同
<span><xsl:text disable-output-escaping="yes">&amp;nbsp;Some text</xsl:text></span>

请注意,&字符已在后一个序列化表单中转义为&amp;

每个人都应该了解disable-output-escaping

disable-output-escaping是一项仅与序列化有关的功能。为了保持序列化 XML的格式良好,XSLT处理器可以逃脱{{1通过使用实体和&(以及可能的其他字符)。他们的转义表单为<&amp;。是否转义,XML 数据是相同的。 XSLT元素&lt;<xsl:value-of>可以具有<xsl:text>属性,但通常建议您避免使用此功能。原因是:

  • XSLT处理器可能只生成一个结果树,该结果树会传递给另一个进程,而不会在进程之间进行序列化。在这种情况下,禁用输出转义将失败,因为XSLT处理器无法控制结果树的序列化。
  • XSLT处理器不需要支持disable-output-escaping属性。在这种情况下,处理器必须转义输出(或者它可能引发错误),所以禁用输出转义将失败
  • XSLT处理器必须转义在用于文档输出的编码中无法表示的字符。在此类字符上使用disable-output-escaping会导致错误或转义文字,因此禁用输出转义将失败
  • 禁用输出转义很容易导致XML格式错误或无效,因此使用它需要非常关注或使用非XML工具对输出进行后期处理。
  • disable-output-escaping经常被误解和误用,并且可以通过更常规的方式实现相同的结果,例如创建新元素作为文字或disable-output-escaping

在这种情况下

<xsl:element>

应该输出

<span><xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;Some text]]></xsl:text></span>

但是<span>&nbsp;Some text</span> 字符被转义了,所以在这种情况下输出转义似乎失败了。

每个人都应该了解使用实体

如果XML文档包含实体引用,则必须声明实体,否则,文档无效。 XML只有5个预定义的实体。他们是:

    {li> & &amp; {li> & &lt; {li> < &gt; {li> > &quot; {li> " &apos;

所有其他实体引用必须在文档的内部DTD中定义,或者在文档引用的外部DTD中定义(直接或间接)。因此,盲目地向XML文档添加实体引用可能会导致文档无效。带有(X)HTML DOCTYPE的文档可以使用多个实体(如'),因为XHTML DTD是指包含其定义的DTD。实体在这三个DTD中定义:http://www.w3.org/TR/html4/HTMLlat1.enthttp://www.w3.org/TR/html4/HTMLsymbol.enthttp://www.w3.org/TR/html4/HTMLspecial.ent

实体引用并不总是被替换文本替换。例如,如果解析器没有网络连接来检索DTD,则可能发生这种情况。非验证解析器也不需要包含替换文本。在这种情况下,实体代表的数据“丢失”。如果实体获得替换工作,则解析数据模型中将没有迹象表明XML序列化完全具有任何实体引用。如果使用实体或其替换值,则数据模型将是相同的。 简而言之:实体只是表示实体参考的替换文本的替代方式。

在这种情况下,&nbsp;的替换文本为&nbsp;(使用十六进制表示法与&#160;相同)。而不是尝试输出&#xA0;实体,只使用@phihag建议的解决方案将更容易,更健壮。如果您喜欢&nbsp;实体的可读性,可以遵循@Michael Krelin建议的解决方案,并在内部DTD中定义该实体。之后,您可以直接在XSLT代码中使用它。

请注意,在这两种情况下,XSLT处理器将输出文字不间断空格字符,而不是&nbsp;实体引用或&nbsp;字符引用。使用XSLT 1.0手动创建此类引用需要使用&#160;功能,如上所述,它有自己的问题。

答案 1 :(得分:4)

我认为您应该使用&#xa0;,因为&nbsp;实体可能未定义。而且没有CDATA。

还有一种可能性是为xsl文件定义nbsp实体:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet [
 <!ENTITY nbsp "&#xa0;">
]>
<xsl:stylesheet version="1.0" …

答案 2 :(得分:1)

在CDATA中,所有值都是字面值。你想要:

<span><xsl:text>&#160;Some text</xsl:text></span>