【问题标题】:How can I validate documents against Schematron schemas in Java?如何根据 Java 中的 Schematron 模式验证文档?
【发布时间】:2009-05-26 12:40:30
【问题描述】:

据我所知,JAXP by default supports W3C XML Schema and RelaxNG from Java 6

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

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

【问题讨论】:

标签: java validation schema jaxp schematron


【解决方案1】:

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

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

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

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

【讨论】:

  • "JAXP 只是一个 API,它不需要实现对 Relax NG 的支持。"这句话中的“不”字是错误的,对吧?你的意思是确实需要支持,对吧?
  • 不,这不是一个错误。 JAXP 仅需要对 W3C XML Schema 的支持,对于其他模式语言,您需要检查实现是否支持。另见java.sun.com/developer/technicalArticles/xml/jaxp1-3/…
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以查看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() ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2012-10-29
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多