无法将XML配置文件加载到XSLT中,document函数执行遭禁止求解决
解决XSLT中document函数被禁止的问题
默认情况下,.NET的XSLT处理器出于安全考量禁用了document()函数,你需要通过XslSettings类开启该功能,同时确保外部XML路径正确、权限足够。以下是具体实现步骤:
1. 在.NET代码中启用document函数
创建XslSettings实例并开启EnableDocumentFunction属性,加载XSLT样式表时传入该配置:
using System.Xml; using System.Xml.Xsl; // 初始化XslSettings,启用document函数 XslSettings xsltSettings = new XslSettings(); xsltSettings.EnableDocumentFunction = true; // 若XSLT中用到脚本逻辑,可开启EnableScript,无需则注释该行 // xsltSettings.EnableScript = true; // 加载XSLT样式表,传入配置与解析器 XslCompiledTransform xsltTransformer = new XslCompiledTransform(); // 替换为你的XSLT文件实际路径 xsltTransformer.Load("your-style-sheet.xslt", xsltSettings, new XmlUrlResolver()); // 执行转换(示例:以输入XML为源,输出到指定文件) XmlDocument inputXml = new XmlDocument(); inputXml.Load("input.xml"); using (XmlWriter outputWriter = XmlWriter.Create("output.xml")) { xsltTransformer.Transform(inputXml, outputWriter); }
2. 修正XSLT中的document函数路径
确保document()的路径写法正确,避免转义错误:
- 推荐使用正斜杠:
document('test/test.xml') - 反斜杠需双重转义:
document('test\\test.xml') - 或直接使用绝对路径:
document('C:/test/test.xml')
示例XSLT代码:
<!-- 读取外部配置XML并应用模板 --> <xsl:apply-templates select="document('test/test.xml')/configuration/settings"/>
3. 安全防护建议
开启document()函数后,需防范恶意文件注入风险:
- 自定义
XmlResolver限制可访问目录,仅允许加载可信路径下的XML文件:
using System.IO; using System.Security; public class RestrictedResolver : XmlUrlResolver { private readonly string _trustedDir; public RestrictedResolver(string trustedDirectory) { _trustedDir = Path.GetFullPath(trustedDirectory); } public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) { string filePath = Path.GetFullPath(absoluteUri.LocalPath); if (!filePath.StartsWith(_trustedDir, StringComparison.OrdinalIgnoreCase)) { throw new SecurityException("禁止访问可信目录外的文件"); } return base.GetEntity(absoluteUri, role, ofObjectToReturn); } } // 加载XSLT时替换为自定义解析器 xsltTransformer.Load("your-style-sheet.xslt", xsltSettings, new RestrictedResolver("C:/trusted-configs/"));
内容的提问来源于stack exchange,提问作者Gopalakrishna
相关产品推荐
相关产品推荐

