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中有一些东西,但这似乎是关于获得具有特定特征的一个实例,而不是确保两个具有相同的特征。
答案 0 :(得分:4)
共现是现有1.0 Schema规范无法解决的问题之一。这是Schematron被释放的原因之一。基于断言的验证可以处理这种情况,以及可以通过XPath表达的任何其他表达相当容易。
此外,在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')"/>
答案 1 :(得分:1)
不确定直接执行此操作的能力。一个简单的选择是将它们嵌入到一个可选元素中,并且需要新元素的每个元素。有点像:
<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>