如何通过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
相关产品推荐
相关产品推荐

