Windows Server 2012 IIS环境下XML自动应用XSLT转换的实现方案
服务器端自动为XML应用XSLT转换(IIS 8/Windows Server 2012)
以下是几种无需修改XML文件即可实现的服务器端自动转换方案,适配你的Windows Server 2012(IIS 8)环境:
方案1:URL重写+ASP.NET Generic Handler(推荐)
通过IIS URL重写模块将XML请求转发到自定义处理程序,在处理程序中完成XSLT转换并输出HTML。
步骤:
安装必要组件:
- 在服务器管理器中,确保已安装
ASP.NET 4.5和URL重写模块(通过「添加角色和功能」向导完成)。
- 在服务器管理器中,确保已安装
编写Generic Handler(.ashx):
在虚拟目录根目录创建XmlXsltHandler.ashx文件,代码如下:<%@ WebHandler Language="C#" Class="XmlXsltHandler" %> using System; using System.Web; using System.Xml; using System.Xml.Xsl; public class XmlXsltHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { // 获取请求的XML文件物理路径 string xmlFilePath = context.Server.MapPath(context.Request.RawUrl); // 替换为你的XSLT文件路径(比如放在虚拟目录下的transform.xslt) string xsltFilePath = context.Server.MapPath("~/transform.xslt"); // 校验文件存在性 if (!System.IO.File.Exists(xmlFilePath) || !System.IO.File.Exists(xsltFilePath)) { context.Response.StatusCode = 404; context.Response.Write("指定文件不存在"); return; } // 设置响应类型为HTML context.Response.ContentType = "text/html"; // 执行XSLT转换 var xsltTransform = new XslCompiledTransform(); xsltTransform.Load(xsltFilePath); var xmlDoc = new XmlDocument(); xmlDoc.Load(xmlFilePath); xsltTransform.Transform(xmlDoc, null, context.Response.Output); } public bool IsReusable => false; }配置URL重写规则:
在虚拟目录的web.config中添加重写规则,将所有.xml请求转发到处理程序:<configuration> <system.webServer> <rewrite> <rules> <rule name="Auto XML to HTML Transform" stopProcessing="true"> <match url="^.*\.xml$" ignoreCase="true" /> <action type="Rewrite" url="XmlXsltHandler.ashx{R:0}" /> </rule> </rules> </rewrite> </system.webServer> </configuration>完成后,访问任意
.xml文件时,IIS会自动调用处理程序完成转换并返回HTML。
方案2:自定义HTTP模块
编写HTTP模块拦截XML请求,在请求管道中直接执行转换,无需URL重写。
步骤:
编写HTTP模块:
创建类库项目编译成DLL,代码示例如下:using System; using System.Web; using System.Xml; using System.Xml.Xsl; public class XmlAutoTransformModule : IHttpModule { public void Init(HttpApplication app) { app.PostMapRequestHandler += OnPostMapRequestHandler; } private void OnPostMapRequestHandler(object sender, EventArgs e) { var app = (HttpApplication)sender; string physicalPath = app.Context.Request.PhysicalPath; // 判断是否为XML文件 if (!physicalPath.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) return; string xsltPath = app.Context.Server.MapPath("~/transform.xslt"); if (!System.IO.File.Exists(xsltPath)) return; // 加载XML和XSLT并执行转换 var xmlDoc = new XmlDocument(); xmlDoc.Load(physicalPath); var xsltTransform = new XslCompiledTransform(); xsltTransform.Load(xsltPath); // 修改响应输出 app.Context.Response.Clear(); app.Context.Response.ContentType = "text/html"; xsltTransform.Transform(xmlDoc, null, app.Context.Response.Output); app.Context.Response.End(); } public void Dispose() {} }注册模块:
将编译后的DLL放到虚拟目录的bin文件夹,然后在web.config中注册模块:<configuration> <system.webServer> <modules> <add name="XmlAutoTransformModule" type="XmlAutoTransformModule" /> </modules> </system.webServer> </configuration>
方案3:CGI脚本(非.NET环境可选)
如果不想依赖.NET,可使用VBScript配合MSXML组件实现转换,需启用IIS的CGI功能。
步骤:
准备脚本:
在虚拟目录创建xml_transform.vbs文件:Set xmlDoc = Server.CreateObject("MSXML2.DOMDocument.6.0") Set xsltDoc = Server.CreateObject("MSXML2.DOMDocument.6.0") xmlFilePath = Server.MapPath(Request.ServerVariables("PATH_INFO")) xsltFilePath = Server.MapPath("~/transform.xslt") xmlDoc.async = False xmlDoc.load(xmlFilePath) xsltDoc.async = False xsltDoc.load(xsltFilePath) Response.ContentType = "text/html" Response.Write(xmlDoc.transformNode(xsltDoc))配置IIS映射:
在IIS管理器中,为虚拟目录添加「处理程序映射」,将.xml扩展名映射到C:\Windows\System32\cscript.exe //nologo "%s",并设置脚本路径为你的xml_transform.vbs(具体需根据IIS CGI配置调整)。
内容的提问来源于stack exchange,提问作者Laurel Davis
相关产品推荐
相关产品推荐

