0

0

如何在 XSLT 中安全转义 XML 内容以生成符合 HTML 规范的输出

霞舞

霞舞

发布时间:2026-01-03 11:07:44

|

420人浏览过

|

来源于php中文网

原创

如何在 XSLT 中安全转义 XML 内容以生成符合 HTML 规范的输出

本文介绍在 .net 环境下使用 xslt 生成 html 时,如何确保 xml 节点内容(包括属性值和文本节点)均被正确 html 实体转义,防止 xss 风险并保证输出合法性。

在使用 System.Xml.Xsl.XslCompiledTransform(XSLT 1.0)进行 XML→HTML 转换时,一个常见且危险的问题是:xsl:value-of 对文本节点会自动转义(如 ——这会导致原始 XML 中已编码的 zuojiankuohaophpcnscriptyoujiankuohaophpcn 在属性中被二次解析为

例如,输入 XML 中的 hello zuojiankuohaophpcnscriptyoujiankuohaophpcnalert('!')zuojiankuohaophpcn/scriptyoujiankuohaophpcn,在 value="{/Contact/Name}" 中会被原样插入,生成:

浏览器将执行该脚本,而预期应为安全转义后的:

✅ 根本原因与限制

.NET 原生 XslCompiledTransform 仅支持 XSLT 1.0,其 xsl:output method="html" 的行为遵循旧版 HTML 输出规则:对属性值不强制 HTML 转义(尤其在模板字符串插值中),仅对 xsl:value-of 和 xsl:copy-of 的文本内容做最小化转义。这意味着你无法通过纯 XSLT 1.0 + .NET 原生引擎实现「所有上下文统一转义」的目标。

立即学习前端免费学习笔记(深入)”;

Soofy
Soofy

通过AI聊天学习新语言

下载

✅ 推荐解决方案:升级至 XSLT 3.0 + XHTML 输出

唯一可靠、标准兼容的解决路径是采用 XSLT 3.0 引擎并设置 method="xhtml"。XHTML 模式要求所有属性值和文本内容均按 XML 规则严格转义,天然满足 HTML 安全输出需求。

以下是在 .NET 6/7+ 中使用 SaxonCS(Saxon 12.x 商业版)或 IKVM 跨编译的 Saxon HE 11.4(免费) 的完整示例:

using net.sf.saxon.s9api;
using System.IO;
using System.Xml;

// 初始化处理器(无验证模式,轻量)
var processor = new Processor(false);

string xml = @"hello zuojiankuohaophpcnscriptyoujiankuohaophpcnalert('!')zuojiankuohaophpcn/scriptyoujiankuohaophpcn";
string xslt = @"

  
  
    
      Name: 
      Input: 
    
  
";

// 编译 XSLT 3.0 样式表
var compiler = processor.NewXsltCompiler();
var executable = compiler.Compile(xslt.AsSource()).Load30();

// 构建输入文档
var docBuilder = processor.NewDocumentBuilder();
var inputDoc = docBuilder.Build(xml.AsSource());

// 执行转换
using var resultWriter = new StringWriter();
executable.ApplyTemplates(inputDoc, processor.NewSerializer(resultWriter));

Console.WriteLine(resultWriter.ToString());

✅ 输出结果(完全符合预期):


  Name: hello zuojiankuohaophpcnscriptyoujiankuohaophpcnalert('!')zuojiankuohaophpcn/scriptyoujiankuohaophpcn
  Input: 
? 注意:data-title 中单引号被转义为 ' 是 XHTML 的合法行为(比 ' 更兼容),而 均被转义为 zuojiankuohaophpcn/youjiankuohaophpcn,确保属性值在 HTML 中始终作为纯文本存在。

⚠️ 重要注意事项

  • 不要尝试手动拼接转义逻辑(如用 replace() 替换
  • 避免 method="html":即使在 XSLT 3.0 下,method="html" 仍可能启用“宽松输出模式”,放弃部分转义保障;务必使用 method="xhtml"。
  • Saxon 版本选择
    • 免费方案:IKVM + Saxon HE 11.4(需额外配置类路径,详见 GitHub 示例);
    • 生产推荐:SaxonCS 12.x(.NET 原生,商业授权,稳定性与性能更优)。
  • xsl:output 必须显式声明:omit-xml-declaration="yes" 可避免 HTML5 文档开头出现 声明,提升兼容性。

✅ 总结

要实现 XML→HTML 转换中属性与文本节点的统一、安全、标准化转义,唯一健壮路径是:
? 放弃 .NET 原生 XslCompiledTransform(XSLT 1.0);
? 迁移至支持 XSLT 3.0 的现代处理器(如 Saxon);
? 显式指定
? 依赖其内置的 XML 序列化规则,而非自定义转义逻辑。

此举不仅解决当前转义问题,更为未来支持 JSON 输出、流式处理、高阶函数等 XSLT 3.0 特性奠定基础。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

403

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

529

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

308

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

499

2023.10.23

HTML与HTML5的区别
HTML与HTML5的区别

HTML与HTML5的区别:1、html5支持矢量图形,html本身不支持;2、html5中可临时存储数据,html不行;3、html5新增了许多控件;4、html本身不支持音频和视频,html5支持;5、html无法处理不准确的语法,html5能够处理等等。想了解更多HTML与HTML5的相关内容,可以阅读本专题下面的文章。

419

2024.03.06

html5从入门到精通汇总
html5从入门到精通汇总

想系统掌握HTML5开发?本合集精选全网优质学习资源,涵盖免费教程、实战项目、视频课程与权威电子书,从基础语法到高级特性(Canvas、本地存储、响应式布局等)一应俱全,适合零基础小白到进阶开发者,助你高效入门并精通HTML5前端开发。

3

2025.12.30

html5新老标签汇总
html5新老标签汇总

HTML5在2026年持续优化网页语义化与交互体验,不仅引入了如<header>、<nav>、<article>、<section>、<aside>、<footer>等结构化标签,还新增了<video>、<audio>、<canvas>、<figure>、<time>、<mark>等增强多媒体与

5

2025.12.30

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

177

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.7万人学习

AngularJS教程
AngularJS教程

共24课时 | 2.2万人学习

CSS教程
CSS教程

共754课时 | 17.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号