0

我们试图找到一种方法来建立一个可以验证某些规则的模式,但是我们尝试了 xs:all、xs:choice、xs:group 和 xs:sequence 的各种组合,但没有成功。规则基本上是这样的:

  1. 应该只出现一次 LICAPPIN01 元素
  2. LICAPPIN99 元素应该只出现一次
  3. 应该有相同数量的 LICAPIN30 和 LICAPIN31
  4. 应该有相同数量的 LICAPIN40 和 LICAPIN41
  5. 至少需要一组 LICAPPIN30/31 或 LICAPPIN40/41(两者都可以)
  6. 对于上述所有内容,顺序无关紧要 - 任何顺序都可以接受

我们尝试过的最简单的模式是这样的:

<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="NewDataSet">
    <xs:complexType>
      <xs:choice  minOccurs="1" maxOccurs="unbounded">
        <xs:element name="LICAPPIN01" minOccurs="1" maxOccurs="1">
        </xs:element>
        <xs:element name="LICAPPIN30" minOccurs="1" maxOccurs="unbounded">
        </xs:element>
        <xs:element name="LICAPPIN31" minOccurs="1" maxOccurs="unbounded">
        </xs:element>
        <xs:element name="LICAPPIN40" minOccurs="1" maxOccurs="unbounded">
        </xs:element>
        <xs:element name="LICAPPIN41" minOccurs="1" maxOccurs="unbounded">
        </xs:element>
        <xs:element name="LICAPPIN99" minOccurs="1" maxOccurs="1">
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

这有很多问题:

  • 它允许多个 LICAPPIN01 和 LICAPPIN99 (替换为 xs:all 可能会解决此问题?)
  • 它不执行规则 3 和 4
  • 对于规则 5,它似乎强制 LICAPPIN30/31 和 LICAPPIN40/41 当它应该只能有两组中的一组时

我们还为 LICAPPIN30/31 和 LICAPPIN40/41 尝试了使用 xs:group 的更复杂的方法,但它违反了规则 6。

知道这是否有可能满足我们所有的基本规则吗?在一个相对简单的 Schema 中。在上面的示例中,我删除了每个 LICAPPINnn 元素中的所有细节——它们每个都包含复杂类型,理想情况下,我们不希望在多个地方重复这些内容。

谢谢,丹尼斯

4

1 回答 1

0

编写一个内容模型来满足您的所有要求并不容易,但很容易满足除最后一个要求之外的所有要求。

如果元素顺序的变化对于传达必要的信息至关重要,那么最好的办法是使用 XSD 1.1 或 Schematron 中的断言。如果元素顺序的变化没有传达任何信息,那么您可以选择声明顺序变化毕竟不是要求。我最推崇的词汇设计权威一致地表示,如果孩子的顺序不能传达信息,那么没有理由不修复它。

这是一个满足您列出的所有要求的内容模型,除了最后一个:

<xs:complexType>
  <xs:sequence>
    <xs:element name="LICAPPIN01"/>
    <xs:choice maxOccurs="unbounded">
      <xs:sequence>
        <xs:element name="LICAPPIN30"/>
        <xs:element name="LICAPPIN31"/>
      </xs:sequence>
      <xs:sequence>
        <xs:element name="LICAPPIN40"/>
        <xs:element name="LICAPPIN41"/>
      </xs:sequence>
    </xs:choice>        
    <xs:element name="LICAPPIN99"/>
  </xs:sequence>
</xs:complexType>
于 2013-02-21T00:37:07.483 回答