7

据我所知,JAXP 默认支持来自 Java 6 的 W3C XML Schema 和 RelaxNG

我可以在schematron.com 链接页面上看到一些 API,大部分是实验性的或不完整的。

是否有一种在 Java 中验证 schematron 的方法是完整的、高效的并且可以与 JAXP API 一起使用?

4

3 回答 3

7

Jing支持 pre-ISO Schematron 验证(请注意,Jing 的实现也是基于 XSLT)。

还有一些 XSLT 实现可以很容易地从 Java 中调用。您需要确定您对哪个版本的 Schematron 感兴趣,然后获取相应的样式表 - 所有这些样式表都应该可以从 schematron.com 获得。该过程非常简单简单,基本上涉及2个步骤:

  • 在您的 Schematron 模式上应用骨架 XSLT 以获得一个新的 XSLT 样式表,该样式表在 XSLT 中表示您的 Schematron 模式
  • 将获得的 XSLT 应用于您的一个或多个实例文档以验证它们

JAXP 只是一个 API,它不需要实现对 Relax NG 的支持。您需要检查您使用的具体实现是否支持 Relax NG。

于 2009-06-07T08:04:28.823 回答
3

纯 Java Schematron 实现位于https://github.com/phax/ph-schematron/ 它支持 XSLT 方法和纯 Java 方法。

于 2013-05-26T09:52:27.147 回答
2

您可以查看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() ...
于 2014-03-09T19:29:52.287 回答