需在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,可考虑以下更安全的做法: