在线XSLT转换器中使用C#代码转换XML报XPST0017错误如何解决
问题根因
<msxsl:script>是微软XSLT处理器的私有扩展特性,不属于任何版本的XSLT官方标准,只有微软自家的.NET XSLT引擎(XslCompiledTransform)、旧版MSXML组件支持这个标签,能自动编译标签内嵌入的C#/VB.NET代码,注册为自定义XPath函数供转换流程调用。- 你在Visual Studio中运行转换时,VS默认调用的就是.NET内置的XSLT引擎,所以C#脚本可以正常执行。
- 绝大多数公共在线XSLT转换器底层使用的是Saxon、Xalan、libxslt这类跨平台开源XSLT引擎,这些引擎完全不识别微软私有的
msxsl:script标签,既不会编译你写的C#代码,也不会注册对应的csharp:CurrentDateTime函数,自然会抛出找不到匹配函数的错误。 - 即便极少数在线转换器部署在Windows服务器上,出于服务器安全考虑(嵌入脚本可执行任意代码,存在读写文件、调用系统命令的风险),也会默认禁用XSLT脚本执行权限,不会允许用户上传的C#代码在服务端运行。
可行解决方案
常规公共在线XSLT转换器无法运行嵌入C#脚本的XSLT代码,你可以根据自己的需求选以下方案:
- 方案1:移除C#脚本依赖,改用XSLT标准语法实现逻辑。这是兼容性最好的方式,改写后可以在所有符合标准的XSLT处理器(包括绝大多数在线转换器)上运行。
以你代码里格式化当前日期的需求为例,XSLT 2.0内置了标准日期处理函数,不需要写C#就能实现:<!-- 替换原来的csharp:CurrentDateTime('yyyy-MM-dd')调用 --> <xsl:value-of select="format-dateTime(current-dateTime(), '[Y0001]-[M01]-[D01]')"/> - 方案2:如果转换逻辑复杂,无法用标准XSLT语法重写,必须依赖C#代码,就不要使用公共在线转换器。你可以自己写几行C#代码调用.NET内置的XSLT引擎完成转换,不需要依赖Visual Studio的IDE功能,核心实现代码如下:
这段代码可以编译成独立的命令行工具,也可以做成你自己私有的网页转换服务,完全可控。using System.Xml.Xsl; // 初始化XSLT转换器,默认支持msxsl脚本 XslCompiledTransform transformer = new XslCompiledTransform(); transformer.Load("你的转换文件.xslt"); // 执行转换,输入源XML路径、输出结果路径 transformer.Transform("源数据.xml", "转换结果.html"); - 方案3:寻找明确标注基于.NET XSLT引擎、且开启了脚本执行权限的在线转换工具,但这类工具数量极少,且因为安全风险随时可能调整权限,不适合作为稳定的转换方案。
内容的提问来源于stack exchange,提问作者saqibhaneef
相关产品推荐
相关产品推荐

