You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Saxon API获取模式感知XSLT的编译警告?

让Saxon EE在C#代码中报告XSLT静态类型警告

这个问题的核心在于你没启用Saxon EE的静态类型检查功能——而Oxygen默认帮你开启了这个配置,所以它能检测到XPath表达式里引用不存在子元素的问题。下面来一步步调整你的代码,让编译器也能报告这类警告:

1. 关键设置:启用静态类型检查

Saxon EE的静态类型检查是EE版本独有的特性,它会在编译阶段基于导入的Schema,严格验证XPath表达式的合法性。你需要给XsltCompiler添加两个关键配置:

  • 开启静态类型检查的特性
  • 把编译器的Schema验证模式设为Strict

2. 修改后的完整C#代码

var samplesDir = new Uri(AppDomain.CurrentDomain.BaseDirectory); 
Processor processor = new Processor(true);
var compiler = processor.NewXsltCompiler();

// 启用静态类型检查(Saxon EE专属)
compiler.SetProperty("http://saxon.sf.net/feature/static-typing", "true");
// 开启编译器层面的严格Schema验证
compiler.SchemaValidationMode = SchemaValidationMode.Strict;

try {
    Xslt30Transformer transformer = compiler.Compile(new Uri(samplesDir, "po.xsl")).Load30();
    Serializer serializer = processor.NewSerializer();
    serializer.SetOutputWriter(Console.Out);
    transformer.SchemaValidationMode = SchemaValidationMode.Strict;
    transformer.ApplyTemplates(File.OpenRead("po.xml"), serializer);
} catch (Exception e) {
    Console.WriteLine(e);
    Console.WriteLine("Schema compilation failed with " + compiler.ErrorList.Count + " errors");
    foreach (StaticError error in compiler.ErrorList) {
        Console.WriteLine("At line " + error.LineNumber + ": " + error.Message);
    }
}

3. 为什么原来的代码没触发警告?

默认情况下,Saxon编译器只会做基础的语法校验和显式的元素存在性检查(比如你改schema-element(PurchaseOrder1)时的报错),但对于XPath表达式内部的子元素引用(比如item1),只有开启静态类型检查后,编译器才会深入分析Schema结构,发现PurchaseOrder类型下并没有item1这个子元素,从而抛出对应的警告或错误。

Oxygen作为专业的XML编辑器,集成Saxon EE时默认启用了这些严格的检查选项,所以能实时提示这类问题。

额外注意事项

  • 确认你使用的是Saxon EE版本,静态类型检查是HE版本不支持的高级功能。
  • 如果你的Schema和XSLT涉及命名空间,记得在xsl:stylesheet中设置xpath-default-namespace,确保命名空间一致,避免检查时因为命名空间不匹配出现遗漏。

内容的提问来源于stack exchange,提问作者MrD at KookerellaLtd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:03:13