CDATA section is just an alternative serialization form to an escaped XML string. 这意味着解析器为 <span><![CDATA[ a & b < 2 ]]></span> 和 <span> a & b < 2 </span> 生成相同的结果 . XML应用程序处理解析的数据,因此XML应用程序应为两个示例输入元素生成相同的输出 .
Briefly: escaped data and un-escaped data inside a CDATA section mean exactly the same.
实体引用并不总是被替换文本替换 . 例如,如果解析器没有网络连接来检索DTD,则可能发生这种情况 . 非验证解析器也不需要包含替换文本 . 在这种情况下,实体代表的数据是"lost" . 如果实体获得替换工作,则解析数据模型中将没有迹象表明XML序列化完全具有任何实体引用 . 如果使用实体或其替换值,则数据模型将相同 . Briefly: entities are only an alternative way to represent the replacement text of the entity reference.
请注意,在这两种情况下,XSLT处理器 will output the literal non-breaking space character 而不是 实体引用或   字符引用 . 使用XSLT 1.0手动创建此类引用需要使用 disable-output-escaping 功能,如上所述,它有自己的问题 .
3 回答
我认为你应该使用
 
,因为
实体很可能没有被定义 . 而且没有CDATA .还有一种可能性是为xsl文件定义
nbsp
实体:另外两个答案是正确的,但我决定对这个问题采取更广泛的看法 .
每个人都应该了解CDATA部分
CDATA section is just an alternative serialization form to an escaped XML string. 这意味着解析器为
<span><![CDATA[ a & b < 2 ]]></span>
和<span> a & b < 2 </span>
生成相同的结果 . XML应用程序处理解析的数据,因此XML应用程序应为两个示例输入元素生成相同的输出 .Briefly: escaped data and un-escaped data inside a CDATA section mean exactly the same.
在这种情况下
是完全相同的
请注意,
&
字符已在后一个序列化形式中转义为&
.每个人都应该了解禁用 - 输出 - 转义
disable-output-escaping is a feature that concerns the serialization only. 为了保持序列化XML的良好格式,XSLT处理器通过使用实体来逃避
&
和<
(以及可能的其他字符) . 他们逃脱的表格是&
和<
. 是否转义,XML数据是相同的 . XSLT元素<xsl:value-of>
和<xsl:text>
可以具有disable-output-escaping
属性,但通常建议避免使用此功能 . 原因是:XSLT处理器可能只生成一个结果树,该结果树被传递给另一个进程而不在进程之间进行序列化 . 在这种情况下 disabling output escaping will fail 因为XSLT处理器无法控制结果树的序列化 .
XSLT处理器不需要支持
disable-output-escaping
属性 . 在这种情况下,处理器必须转义输出(或者它可能引发错误),所以再次, disabling output escaping will fail .XSLT处理器必须转义在用于文档输出的编码中无法表示的字符 . 在这些字符上使用
disable-output-escaping
将导致错误或转义文本,所以再次, disabling output escaping will fail .禁用输出转义很容易导致格式错误或XML无效,因此使用它需要非常关注或使用非XML工具对输出进行后期处理 .
disable-output-escaping
经常被误解和误用,并且可以通过更常规的方式实现相同的结果,例如创建新元素作为文字或<xsl:element>
.在这种情况下
应该输出
但是
&
字符反而被转义了,所以在这种情况下输出转义似乎失败了 .每个人都应该了解使用实体的内容
If an XML document contains an entity reference, the entity must be declared ,如果没有,则该文件无效 . XML只有5个预定义的实体 . 他们是:
&
for&
<
for<
>
for>
"
for"
'
for'
所有其他实体引用必须在文档的内部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,则可能发生这种情况 . 非验证解析器也不需要包含替换文本 . 在这种情况下,实体代表的数据是"lost" . 如果实体获得替换工作,则解析数据模型中将没有迹象表明XML序列化完全具有任何实体引用 . 如果使用实体或其替换值,则数据模型将相同 . Briefly: entities are only an alternative way to represent the replacement text of the entity reference.
在这种情况下,
的替换文本是 
(与使用十六进制表示法的 
相同) . 而不是尝试输出
实体,只使用@phihag建议的解决方案将更容易,更健壮 . 如果您喜欢
实体的可读性,可以遵循@Michael Krelin建议的解决方案,并在内部DTD中定义该实体 . 之后,您可以直接在XSLT代码中使用它 .请注意,在这两种情况下,XSLT处理器 will output the literal non-breaking space character 而不是
实体引用或 
字符引用 . 使用XSLT 1.0手动创建此类引用需要使用disable-output-escaping
功能,如上所述,它有自己的问题 .在CDATA中,所有值都是字面值 . 你要: