【问题标题】:Can XML Schema specify co-occurrence constraints?XML Schema 可以指定共现约束吗?
【发布时间】:2009-07-15 02:03:44
【问题描述】:

XML Schema 文档能否指定两个项目必须同时出现?

例如,有两个可选元素,它们要么都存在,要么都不存在。

a b? c d? e      # giving only {ace, abcde}
                 # instead of all combinations: {ace, acde, abce, abcde}

<element name="root">
  <complexType>
    <sequence>
      <element ref="a"/>
      <element ref="b" minOccurs="0"/>
      <element ref="c"/>
      <element ref="d" minOccurs="0"/>
      <element ref="e"/>
    <sequence>
  <complexType>
<element>

另一个例子:有两个重复的元素,无论第一个出现多少次,第二个也出现很多次:

a b^n c d^n e  # where ^n is a superscript denoting number of repeats
               # giving {ace, abcde, abbcdde, abbbcddde, ...}
               # but no other combinations

<element name="root">
  <complexType>
    <sequence>
      <element ref="a"/>
      <element ref="b" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="c"/>
      <element ref="d" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="e"/>
    <sequence>
  <complexType>
<element>

也许在 XML Schema 规范中的 identity constraints 中有一些内容,但这似乎是关于获得一个具有特定特征的实例,而不是确保两个实例具有相同的特征。

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    共现是现有 1.0 架构规范无法解决的问题之一。这也是Schematron 发布的原因之一。基于断言的验证可以处理这种情况,以及任何其他可以通过 XPath express 轻松表达的情况。

    此外,在 1.1 Schema spec 中有断言功能,但我还不知道处理器对 1.1 的广泛支持。

    基于断言的验证通常围绕信用卡交易进行的经典示例,例如:

    <card>
      <number>1111-1111-1111</number>
      <type>mastercard</type>
    </card>
    

    在这里,我们要确保万事达卡号码以“1”开头,签证以“2”开头(当然不是真正的惯例)。 Schema 1.0 无法做到这一点,但通过断言(在伪代码中)很容易

    <assert test="starts-with(card/type[.='mastercard'],'1')"/>
    

    【讨论】:

    • Saxon-EE 是完全符合 XSD 1.1 模式的处理器:saxonica.com
    【解决方案2】:

    不确定是否可以直接执行此操作。不过,一个简单的选择是将它们嵌入到单个可选元素中,并要求新元素的每个元素都是必需的。大致如下:

    <element name="root">
      <complexType>
        <sequence>
          <element ref="a"/>
          <element ref="c"/>
          <element ref="f" minOccurs="0">
            <complexType>
              <element ref="b" minOccurs="1"/>
              <element ref="d" minOccurs="1"/>
            </complexType>
          </element>
          <element ref="e"/>
        </sequence>
      </complexType>
    </element>
    

    【讨论】:

    • 谢谢,是的,这适用于元素相邻的特殊情况;尽管对于重复,您会得到 bdbdbd... 而不是 bbbddd。顺便说一句:我认为您的意思是 是一个模型组 .
    • 另外,对于重复的相邻元素,上下文无关文法可以通过递归 (A --> b A d) 来实现,但规范明确不允许模型组这样做(递归必须具有嵌套在其中的元素)。顺便说一句,我对一般的共现感兴趣,包括不相邻的元素。我认为在 XML Schema 中没有办法做到这一点,但一些聪明的人可能已经找到了办法(也许使用嵌套的 keyrefs ......?)
    猜你喜欢
    • 2010-09-24
    • 2011-12-04
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多