需在xsl:value-of或xsl:copy-of中设disable-output-escaping="yes",当输出含HTML/XML标签的字符串且需浏览器解析为真实标记而非文本时使用,但仅对字符串值有效、有XSS风险,推荐用xsl:copy-of结构化内容或xsl:analyze-string替代。

disable-output-escaping 是 XSLT 中用于防止 XML 特殊字符被自动转义的机制,常用于需要原样输出 HTML 标签、XML 片段或包含 、& 等字符的文本场景。
什么时候需要用 disable-output-escaping?
当 XSLT 的 xsl:value-of 或 xsl:copy-of 输出的内容本身是已格式化的标记(比如一段含 HTML 标签的字符串),而你希望浏览器或下游处理器将其当作真实标签解析,而非纯文本显示时,就需要禁用转义。
例如:源数据中有一个字段值为 "重点",默认输出会变成 zuojiankuohaophpcnemyoujiankuohaophpcn重点zuojiankuohaophpcn/emyoujiankuohaophpcn(显示为文字),启用后才真正渲染为斜体。
基本语法与写法
只在 xsl:value-of 或 xsl:copy-of 中通过 disable-output-escaping="yes" 属性启用:
注意:disable-output-escaping="no" 是默认行为,可省略;只有设为 yes 才生效。该属性对 xsl:text 和模板内容无效。
重要限制与风险
这个功能不是万能的,且有明确约束:
- 仅对字符串值有效——如果
select返回的是节点集(如元素),disable-output-escaping不起作用(此时应改用xsl:copy-of) - 输出目标必须支持未转义内容——比如 XHTML 输出时若声明了
doctype且使用xml方法,部分处理器可能忽略该设置 - 容易引发 XSS 或格式错误——若数据含恶意脚本或不闭合标签,直接输出会导致解析异常或安全问题
- XSLT 2.0+ 中仍保留该属性,但推荐优先用
xsl:character-map或预处理方式替代,更可控
替代方案建议
为避免滥用 disable-output-escaping,可考虑以下更安全的做法:
- 把原始 HTML 存为子元素而非文本节点,用
xsl:copy-of复制整个结构 - 用
xsl:analyze-string(XSLT 2.0+)配合正则提取并构造节点 - 在数据源层就提供结构化内容(如用
重点而非字符串"重点") - 服务端预处理:在进入 XSLT 前将字符串解析为 DOM 片段,再传入为节点树










