我正在尝试使用比 XSD 更复杂的 Schematron 验证 XML 文件。我用谷歌搜索了很多,最好的结果是这个Microsoft 网站。但这仅显示了如何使用 NMatrix.Schematron 使用 XSD 进行验证,这不是我需要的。我有 NMatrix.Schematron DLL,但我不知道如何使用它们。有谁知道如何使用它?
3 回答
我建议您改用 Rick Jelliffe 的ISO Schematron 参考实现,它使用纯 XSLT,最好是 XSLT 2.0,以及已建立的 XSLT 处理器,例如 Michael Kay 的Saxon。
使用Nuget 的 Saxon-HE会更好,因为它现在在 .NET 上支持的功能比 Schematron 多得多>
我正在使用Schematron.NET - 下载源代码和示例,编译它或仅使用示例中的 DLL。
然后我完全剪掉了图片的 XSLT,因为我不需要它。但是缺少一些像选择和类似的东西,但大多数都可以使用 XPath 进行测试。因为它有点旧,它没有实现所有的功能:(
这是使用 Schematron 验证的扩展版本
using NMatrix.Schematron;
...
Schema schematronSchema = new Schema();
schematronSchema.Load(new FileStream("C:/thefile.sch", FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
vld.AddSchema(schematronSchema);
vld.Validate(new MemoryStream(Encoding.UTF8.GetBytes(XML_String)));
我使用文件流加载,这样文件就不会被锁定,这是在.NET 的 XSLT 引擎中构建的常见问题
然后在“.sch”文件中它只是简单,在我看来更整洁的方式来验证模式数据。
<?xml version="1.0" encoding="utf-8" ?>
<schema xmlns="http://www.ascc.net/xml/schematron" title="Schema for Blah">
<pattern name="A descriptive name">
<rule context="DataNodeOrElement">
<assert test="Xpath, where Name is element and @name is attribute"> Error Message </assert>
</rule>
</pattern>
例如。
<root>
<version>1</version>
<data>
<name surname="rulez">ppumkin</name>
<age>na</age>
<title/>
</data>
</root>
<rule context="data">
<assert test="name != ''"> No name specified </assert>
<assert test="@surname != 'rulez'"> This is not the ppumkin I know!</assert>
<assert test="number(age) < 110"> Not a number or not specified</assert>
<assert test="number(age) > 18"> Your under age. Get 'outa!ahere!</assert>
</rule>
请记住,只有在测试失败时才会发生错误。即如果你有兴趣阻止 18 岁以下,你需要测试他们是否超过 18 岁。习惯它有点奇怪。
老实说,我以前从未使用过 Schematron,现在我将 XML 视为埃博拉病毒以及与它有关的任何事情——但有时我们别无选择。
Schematron.NET 中的示例向您展示了如何将 XSLT1/XLST2 与 Schematron 混合使用以获得额外的控制和决策。
一些程序,如 oXygen,支持 schematron 验证,但它们可能在后台使用类似 RI 的东西。