首页 文章

Xpath结果与xs:断言结果

提问于
浏览
1

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

我想确保复杂类型中的元素是基本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>

因为赋值人有三个枚举而其他元素有两个 . 无论我将它放在基本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) .

样品限制:

<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上 Build 断言,还是只对例子数据进行求值?在我看来,由于'mytype'是'myBaseType'的限制,因此应该应用断言 .

1 回答

  • 2

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

    你可以从XML Schema schema开始 . 但是,您应该考虑使用Schematron断言,这可能更适合选择性地执行约束 . 我使用Schematron而不是XSD来强制执行组织惯例,并发现它是检查所采用策略合规性的可行方法 .


    每个OP评论更新

    '如果你想对XSD本身做出断言,你必须创建一个将原始XSD视为XML文档的meta-xsd' - 是的,这就是我所做的 .

    不,这不是你试图从验证XML文档实例的相同XSD对XSD进行断言的原因 . 它是一个单独的XSD通过 xsd:include 引入的事实没有改变;它已经低估了这项任务所涉及的复杂性 . 如果你没有意识到meta XSD必须做什么 .

    我真的更喜欢不使用schematron,如果可以用XSD 1.1完成,那么为什么要添加另一个复杂元素呢?

    因为通过Schematron或其他技术强制执行点约束的复杂性实际上低于通过XSD验证所有XSD的复杂性,然后加上一些断言来覆盖点约束 . 此外,XSD 1.1 's assertion facilities are considerably more restricted than Schematron'的断言 .

相关问题