XML模式可以指定共现约束吗?
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
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')"/>