我有以下xslt:
<span><xsl:text disable-output-escaping="yes"><![CDATA[ Some text]]></xsl:text></span>
转化后,我得到:
<span>&nbsp;Some text</span>
呈现为:&amp;一些文字
我想渲染&amp; NBSP;作为空间角色。我已经尝试过将disable-output-escaping改为no,但它没有帮助。
感谢您的帮助。
答案 0 :(得分:6)
另外两个答案是正确的,但我决定对这个问题采取更广泛的看法。
CDATA部分只是转义的XML字符串的替代序列化表单。这意味着解析器会为<span><![CDATA[ a & b < 2 ]]></span>
和<span> a & b < 2 </span>
生成相同的结果。 XML应用程序处理解析的数据,因此XML应用程序应为两个示例输入元素生成相同的输出。
简要说明:CDATA
部分内的转义数据和未转义数据的含义完全相同。
在这种情况下
<span><xsl:text disable-output-escaping="yes"><![CDATA[ Some text]]></xsl:text></span>
与
相同<span><xsl:text disable-output-escaping="yes">&nbsp;Some text</xsl:text></span>
请注意,&
字符已在后一个序列化表单中转义为&
。
disable-output-escaping
disable-output-escaping
是一项仅与序列化有关的功能。为了保持序列化 XML的格式良好,XSLT处理器可以逃脱{{1通过使用实体和&
(以及可能的其他字符)。他们的转义表单为<
和&
。是否转义,XML 数据是相同的。 XSLT元素<
和<xsl:value-of>
可以具有<xsl:text>
属性,但通常建议您避免使用此功能。原因是:
disable-output-escaping
属性。在这种情况下,处理器必须转义输出(或者它可能引发错误),所以禁用输出转义将失败。disable-output-escaping
会导致错误或转义文字,因此禁用输出转义将失败。disable-output-escaping
经常被误解和误用,并且可以通过更常规的方式实现相同的结果,例如创建新元素作为文字或disable-output-escaping
。在这种情况下
<xsl:element>
应该输出
<span><xsl:text disable-output-escaping="yes"><![CDATA[ Some text]]></xsl:text></span>
但是<span> Some text</span>
字符被转义了,所以在这种情况下输出转义似乎失败了。
如果XML文档包含实体引用,则必须声明实体,否则,文档无效。 XML只有5个预定义的实体。他们是:
&
&
{li> &
<
{li> <
>
{li> >
"
{li> "
'
所有其他实体引用必须在文档的内部DTD中定义,或者在文档引用的外部DTD中定义(直接或间接)。因此,盲目地向XML文档添加实体引用可能会导致文档无效。带有(X)HTML DOCTYPE的文档可以使用多个实体(如'
),因为XHTML DTD是指包含其定义的DTD。实体在这三个DTD中定义:http://www.w3.org/TR/html4/HTMLlat1.ent,http://www.w3.org/TR/html4/HTMLsymbol.ent和http://www.w3.org/TR/html4/HTMLspecial.ent。
实体引用并不总是被替换文本替换。例如,如果解析器没有网络连接来检索DTD,则可能发生这种情况。非验证解析器也不需要包含替换文本。在这种情况下,实体代表的数据“丢失”。如果实体获得替换工作,则解析数据模型中将没有迹象表明XML序列化完全具有任何实体引用。如果使用实体或其替换值,则数据模型将是相同的。 简而言之:实体只是表示实体参考的替换文本的替代方式。
在这种情况下,
的替换文本为
(使用十六进制表示法与 
相同)。而不是尝试输出 
实体,只使用@phihag建议的解决方案将更容易,更健壮。如果您喜欢
实体的可读性,可以遵循@Michael Krelin建议的解决方案,并在内部DTD中定义该实体。之后,您可以直接在XSLT代码中使用它。
请注意,在这两种情况下,XSLT处理器将输出文字不间断空格字符,而不是
实体引用或
字符引用。使用XSLT 1.0手动创建此类引用需要使用 
功能,如上所述,它有自己的问题。
答案 1 :(得分:4)
我认为您应该使用 
,因为
实体可能未定义。而且没有CDATA。
还有一种可能性是为xsl文件定义nbsp
实体:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " ">
]>
<xsl:stylesheet version="1.0" …
答案 2 :(得分:1)
在CDATA中,所有值都是字面值。你想要:
<span><xsl:text> Some text</xsl:text></span>