据我所知,JAXP 默认支持来自 Java 6 的 W3C XML Schema 和 RelaxNG。
我可以在schematron.com 链接页面上看到一些 API,大部分是实验性的或不完整的。
是否有一种在 Java 中验证 schematron 的方法是完整的、高效的并且可以与 JAXP API 一起使用?
据我所知,JAXP 默认支持来自 Java 6 的 W3C XML Schema 和 RelaxNG。
我可以在schematron.com 链接页面上看到一些 API,大部分是实验性的或不完整的。
是否有一种在 Java 中验证 schematron 的方法是完整的、高效的并且可以与 JAXP API 一起使用?
Jing支持 pre-ISO Schematron 验证(请注意,Jing 的实现也是基于 XSLT)。
还有一些 XSLT 实现可以很容易地从 Java 中调用。您需要确定您对哪个版本的 Schematron 感兴趣,然后获取相应的样式表 - 所有这些样式表都应该可以从 schematron.com 获得。该过程非常简单简单,基本上涉及2个步骤:
JAXP 只是一个 API,它不需要实现对 Relax NG 的支持。您需要检查您使用的具体实现是否支持 Relax NG。
纯 Java Schematron 实现位于https://github.com/phax/ph-schematron/ 它支持 XSLT 方法和纯 Java 方法。
您可以查看SchematronAssert(披露:我的代码)。它主要用于单元测试,但您也可以将它用于普通代码。它是使用 XSLT 实现的。
单元测试示例:
ValidationOutput result = in(booksDocument)
.forEvery("book")
.check("author")
.validate();
assertThat(result).hasNoErrors();
独立验证示例:
StreamSource schemaSource = new StreamSource(... your schematron schema ...);
StreamSource xmlSource = new StreamSource(... your xml document ... );
StreamResult output = ... here your SVRL will be saved ...
// validation
validator.validate(xmlSource, schemaSource, output);
使用 SVRL 的对象表示:
ValidationOutput output = validator.validate(xmlSource, schemaSource);
// look at the output
output.getFailures() ...
output.getReports() ...