xml - Xpath 结果与 xs :assert result

标签 xml xpath xsd

我正在使用 oXygen XML Editor 16.1,使用 SaxonEE set for XML Schema 1.1 进行这些测试。

我想确保 complexType 中作为基本 complexType 限制的元素具有相同数量的枚举。 (代码如下)

示例 complexType(帖子底部)应该无法通过此断言:

<xs:assert test="count(//xs:element[@name='id-name']//xs:enumeration)  
eq count(//xs:element[@name='issuer']//xs:enumeration) 
and
count(//xs:element[@name='issuer']//xs:enumeration) 
eq count(//xs:element[@name='assignor']//xs:enumeration)"></xs:assert>

因为 assignor 有三个枚举,而其他元素有两个。无论我将它放在基本 complexType 还是受限 complexType 中,它仍然将限制显示为有效模式。

如果我执行这个
count(//xs:element[@name='id-name']//xs:enumeration) 
  eq count(//xs:element[@name='issuer']//xs:enumeration) and
count(//xs:element[@name='issuer']//xs:enumeration) 
  eq count(//xs:element[@name='assignor']//xs:enumeration)

在 XPath 编辑器中,它按预期失败(返回 false),并且当所有三个都有两个枚举时通过(返回 true)。

sample 限制:
 <xs:complexType name='mytype' xml:lang='en-US'>
<xs:complexContent>
  <xs:restriction base='myBaseType'>
    <xs:sequence>
        <xs:element maxOccurs='1' minOccurs='1' name='id-name'>
          <xs:simpleType>
            <xs:restriction base='xs:string'>
              <xs:enumeration value='URI'></xs:enumeration>
              <xs:enumeration value='ID Number'></xs:enumeration>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element maxOccurs='1' minOccurs='1' name='issuer'>
          <xs:simpleType>
            <xs:restriction base='xs:string'>
              <xs:enumeration value='Owner'/>
              <xs:enumeration value='Owner'/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element maxOccurs='1' minOccurs='1' name='assignor'>
          <xs:simpleType>
            <xs:restriction base='xs:string'>
              <xs:enumeration value='Owner'/>
              <xs:enumeration value='Owner'/>
              <xs:enumeration value='Owner'/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
      </xs:sequence>
    </xs:restriction>
  </xs:complexContent>
    </xs:complexType>

'myBaseType' 在另一个模式中,该模式“包含”在这个模式中。那个 complexType 看起来像这样:
  <xs:complexType name="myBaseType">
<xs:complexContent>
  <xs:extension base="someType">
    <xs:sequence>
      <xs:element maxOccurs="1" minOccurs="0" name="id-name" type="xs:string"></xs:element>
      <xs:element maxOccurs="1" minOccurs="0" name="issuer" type="xs:string"></xs:element>
      <xs:element maxOccurs="1" minOccurs="0" name="assignor" type="xs:string"></xs:element>
    </xs:sequence>
    <xs:assert test="count(//xs:element[@name='id-name']//xs:enumeration) eq count(//xs:element[@name='issuer']//xs:enumeration) and
      count(//xs:element[@name='issuer']//xs:enumeration) eq count(//xs:element[@name='assignor']//xs:enumeration)
      "></xs:assert>
  </xs:extension>
</xs:complexContent>

我错过了什么?我不能在限制 complexType 上建立断言还是只对实例数据进行评估?在我看来,由于“mytype”是对“myBaseType”的限制,那么应该应用断言。

最佳答案

正如您在问题末尾所预期的那样,断言的范围是由 XSD 管理的 XML 文档实例,而不是 XSD 本身。如果您希望对 XSD 本身进行断言,则必须创建一个 meta-xsd,将原始 XSD 视为 XML 文档。

您可以从 XML Schema schema 开始.但是,您应该考虑使用 Schematron断言,这对于选择性地执行约束可能会更好。我使用过 XSD 上的 Schematron 来强制执行组织约定,并发现它是一种检查已采用策略的合规性的可行方法。

根据 OP 评论更新

'If you wish to make assertions about the XSD itself, you'd have to create a meta-xsd that treated the original XSD as an XML document' -- Yes, that is what I did.



不,那不是你所做的。您正尝试从验证 XML 文档实例的同一个 XSD 对 XSD 进行断言。事实上,它是通过 xsd:include 引入的单独 XSD什么都没有改变;它仍然只是域 XSD,而不是域 XSD 的元 XSD。我说的是你必须有一个元 XSD,这意味着一个单独的 XSD 可以验证你的域 XSD。您低估了此类任务所涉及的复杂性。如果您不是从 XML Schema 模式开始,那么您就没有意识到元 XSD 必须做什么。

I really prefer to not use schematron, if this can be done with XSD 1.1 then why add another element of complexity?



因为通过 Schematron 或其他技术强制执行点约束的复杂性实际上低于通过 XSD 验证所有 XSD 然后附加一些断言以覆盖点约束的复杂性。此外,XSD 1.1 的断言工具比 Schematron 的断言更受限制。

关于xml - Xpath 结果与 xs :assert result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29151087/

相关文章:

xml - 是否可以在此 golang 代码中使用 less `struct`?

android - 仅适用于 Android Studio 中设计预览选项卡的 xml View 的占位符

java - 使用 Jersey JAX-RS 进行复杂的解编码(列表列表)

xml 正则表达式/正则表达式 OR 运算符

c# - 以表格形式查看 XML 数据

java - 使用 JAXB 解码 xml 文件

xml - relaxng:模式定义无效?

html - 用于选择包含随机数的 html id 的 Xpath

selenium - CSS选择器-如何定位父元素

xml - 我的xml有什么问题?