【问题标题】:Schematron assert statement had been fired; where did that happen in the document?Schematron 断言语句已被触发;文件中哪里发生了这种情况?
【发布时间】:2016-02-25 11:14:37
【问题描述】:

我想在使用多种验证技术后突出显示 XML 文档的某些部分。在 XML 中定位 XSD 验证失败没有问题,可以跟踪错误行。 但是,一些验证步骤是由 Schematron 断言和报告语句完成的。当我在使用诊断元素触发断言/报告语句时发回当前 XPath 位置时,即使上下文非常特定于语句,我也只能返回根。

有什么方法可以获取行号或 XPath 字符串来定位触发 Schematron 断言语句的位置?

【问题讨论】:

  • 您将 Schematron 与什么验证工具或库一起使用? Xerces 等工具将始终指向文档中断言失败的特定点。
  • 实际上我使用 C# 从 xsd 文件中提取 Schematron 规则,然后使用 C# 命令验证 XSD 和 Schematron,然后我读取了两者的验证消息。我认为 Schematron 断言/报告语句中可能有一个选项,我可以使用它轻松调用 XPath 位置,但我还没有找到这样的选项。

标签: xpath location assert schematron


【解决方案1】:

在 svrl(Schematron 验证报告语言)报告中有一个“位置”属性,它返回 断言/报告语句的上下文。可以利用诊断收集路径的最后一位 元素并返回当前节点。这种方式清理报告文本并将其与诊断相结合 仍然可以使用户免于冗长的错误消息并获得可用于 组装触发的断言/报告语句的 XPath。

<sch:diagnostics>
    <sch:diagnostic id="testDiagnostic">
        <sch:name path="."/>
    </sch:diagnostic>
</sch:diagnostics>

<sch:rule context="//ELEMENT1[ELEMENT2/ELEMENT3 = 'TRIAL TEXT']/ELEMENT4">
    <sch:assert test="ELEMENT5[@name = 'TRIAL TEXT2' and @type = 'TRIAL TEXT3']" diagnostics="testDiagnostic">TEST FEEDBACK.</sch:assert>
</sch:rule>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多