Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML模式可以指定共现约束吗?_Xml_Xsd - Fatal编程技术网

XML模式可以指定共现约束吗?

XML模式可以指定共现约束吗?,xml,xsd,Xml,Xsd,XML模式文档能否指定两项必须同时出现 例如,有两个可选元素,它们要么都存在,要么都不存在 a b? c d? e # giving only {ace, abcde} # instead of all combinations: {ace, acde, abce, abcde} <element name="root"> <complexType> <sequence> <eleme

XML模式文档能否指定两项必须同时出现

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

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>
ab?c-d?只给{ace,abcde}
#而不是所有组合:{ace、acde、abce、abcde}
另一个例子:有两个重复的元素,第一个元素出现多少次,第二个元素也出现多少次:

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>
a b^n c d^n e#其中^n是表示重复次数的上标
#给予{ace,abcde,ABBCDDDE,}
#但没有其他组合

也许XML模式规范中有一些东西,但这似乎是关于只获取一个具有特定特征的实例,而不是确保两个实例具有相同的特征。

不确定是否有能力直接这样做。不过,一个简单的选择是将它们嵌入到单个可选元素中,并要求新元素的每个元素都是必需的。大致如下:

<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>

共现是现有1.0模式规范无法解决的问题之一。这是被释放的原因之一。基于断言的验证可以处理这种情况,以及任何其他可以通过XPath express非常容易地表达的情况

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

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

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

1111-1111-1111
万事达卡
在这里,我们要确保万事达卡号以“1”开头,visa卡以“2”开头(当然不是真正的惯例)。使用Schema 1.0无法做到这一点,但通过断言(在伪代码中)非常简单



谢谢,是的,这适用于元素相邻的特殊情况;虽然对于重复,你会得到BDBD。。。而不是bbbddd。顺便说一句:我想你的意思是作为一个模型组。另外,对于重复的相邻元素,上下文无关语法可以通过递归(a-->b a d)来实现,但是规范明确禁止对模型组使用递归(递归中必须嵌套一个元素)。这只是一个旁白,我对共现感兴趣,包括非相邻元素。我认为在XML模式中没有办法做到这一点,但一些聪明的人可能已经找到了一种方法(可能使用嵌套的keyrefs…?)Saxon EE是一种完全符合XSD 1.1模式处理器:
<assert test="starts-with(card/type[.='mastercard'],'1')"/>