无法找到一种方法来创建匹配随机订单项和条件的XML架构

时间:2013-02-20 20:38:39

标签: xsd

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

  1. 只应出现一次LICAPPIN01元素
  2. 只应出现一次LICAPPIN99元素
  3. 应该有相同数量的LICAPPIN30和LICAPPIN31
  4. 应该有相同数量的LICAPPIN40和LICAPPIN41
  5. 至少需要一套LICAPPIN30 / 31或LICAPPIN40 / 41(两者都可以在那里)
  6. 对于以上所有情况,订单无关紧要 - 任何订单都可以接受
  7. 我们尝试的最简单的架构是:

    <?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:所有可能解决这个问题吗?)
    • 它不强制执行规则3和4
    • 对于规则5,似乎强制LICAPPIN30 / 31和LICAPPIN40 / 41何时应该只能拥有两套中的一套

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

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

    谢谢, 丹尼斯

1 个答案:

答案 0 :(得分: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>