使用 SAXON EE 版本针对 schematron 验证 XML

Validate XML against schematron using SAXON EE edition

我正在评估 SAXON EE 版本以针对 xsd 和 schematron 验证 XML。

谁能帮我解决以下问题:

  1. 在根据 xsd 验证 xml 文档时,我们是否还可以获取该错误节点的 xpath 以及纯文本中的错误。目前我只收到错误。

  2. 我们可以使用 Saxon EE 版本针对 schematron 验证 xml 吗?任何代码示例都会有很大帮助。

谢谢。

1.在根据 xsd 验证 xml 文档时,我们是否还可以获取该错误节点的 xpath。

是的,错误信息包括对无效节点的 XPath 引用(在大多数情况下:在某些情况下,例如没有一个特定节点出错的重复 ID)。

如果您使用 SchemaValidator.SetValidityReporting() 生成 XML 有效性报告,则生成的报告将包含路径信息。这是一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<validation-report xmlns="http://saxon.sf.net/ns/validation"
                   system-id="file:/Users/mike/repo2/samples/data/books-invalid.xml">
   <error line="3"
          column="17"
          path="/Q{}BOOKLIST[1]/Q{}BOOKS[1]/@x"
          xsd-part="1"
          constraint="cvc-complex-type.3">Attribute @x is not allowed on element &lt;BOOKS&gt;</error>
   <error line="10"
          column="17"
          path="/Q{}BOOKLIST[1]/Q{}BOOKS[1]/Q{}ITEM[1]/Q{}PRICE[1]"
          xsd-part="2"
          constraint="cvc-datatype-valid.1">The content "[=10=].2" of element &lt;PRICE&gt; does not match the required simple type. Cannot convert string to decimal: [=10=].2</error>
   <error line="21"
          column="20"
          path="/Q{}BOOKLIST[1]/Q{}BOOKS[1]/Q{}ITEM[2]/Q{}PUB-DATE[1]"
          xsd-part="2"
          constraint="cvc-datatype-valid.1">The content "2002-02-31" of element &lt;PUB-DATE&gt; does not match the required simple type. Invalid date "2002-02-31" (Non-existent date)</error>
   <error line="42"
          column="22"
          path="/Q{}BOOKLIST[1]/Q{}BOOKS[1]/Q{}ITEM[3]/Q{}REPUTATION[1]"
          xsd-part="1"
          constraint="cvc-complex-type.2.4">In content of element &lt;ITEM&gt;: The content model does not allow element &lt;REPUTATION&gt; to appear immediately after element &lt;WEIGHT&gt;. No further elements are allowed at this point. </error>
   <meta-data>
      <validator name="SAXON-EE" version="9.8.0.9"/>
      <results errors="4" warnings="0"/>
      <schema file="books.xsd" xsd-version="1.1"/>
      <run at="2018-03-07T15:22:04.847Z"/>
   </meta-data>
</validation-report>

如果您提供 IInvalidityHandler 作为对 SchemaValidator 的回调,您也可以获得信息,尽管这需要更多的挖掘。 Saxon 调用您的 IInvalidityHandler 提供一个 StaticError 对象(这有点用词不当)。 StaticError 对象没有直接可用的路径信息,但它包含对可以转换为 ValidationExceptionXPathException 对象的引用,并且 ValidationException 有一个方法 getPath() 其中 returns 此信息(如果可用)。

2。我们可以针对 schematron 验证 xml。

Saxon 本身不包含 schematron 验证器,尽管许多执行 schematron 验证的 third-party 工具都使用 Saxon "under the hood"。我不了解 .NET 上的情况 - 但本质上有两种 Schematron 处理器:从 schematron 模式生成 XSLT 代码的处理器(通常使用 Saxon 来生成 XSLT 并执行它)和 "native" 个处理器。搜索 "schematron on .NET" 可以找到很多项目,但我不知道它们的当前状态或质量。