我对XML模式还不熟悉,我正试图找出如何根据另一个值设置限制。
例如:
" state“= RI
无论状态如何,下面的xml模式都允许ABS和Y:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="State">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="RI"/>
<xs:enumeration value="CT"/>
<xs:enumeration value="NC"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="PersonalInfo">
<xs:complexType>
<xs:sequence>
<xs:element ref="State"/>
<xs:element ref="Car"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Manufacturer">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="MINI"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Car">
<xs:complexType>
<xs:sequence>
<xs:element ref="Manufacturer"/>
<xs:element ref="AntiLockBrakes"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="AntiLockBrakes">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="ABS"/>
<xs:enumeration value="Y"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>发布于 2013-03-09 23:47:57
因为这类约束控制的不是单独涉及的单独元素的值,而是特定值的共存,因此它们通常被称为共现约束(或更简洁的共约束)。
上下文无关的语法(以及模式语言,这些语言本质上提供了专门的词汇表,用于为XML文档编写上下文无关的语法--比如DTD、Relax NG和XSD内容模型)在一般情况下并不能很好地处理共同约束(尽管它们通常可以轻松地处理一些特殊情况)。
基于谓词的约束语言(如Schematron和XSD 1.1中的断言)通常能够方便地表示协同约束,因为它们是围绕谓词(对文档、元素或属性来说是正确的或不成立的东西)的概念构建的,并且通常允许使用布尔运算符组合谓词。
因此,执行您所描述的约束的最佳选择是使用Schematron或XSD1.1中的断言。在XSD1.1中(与Schematron不同),断言不允许在附加断言类型的元素之外查看,因此您需要将断言放在包含State和AntiLockBrakes元素的最小元素上;如果我读取的模式正确,那就是PersonalInfo。XSD1.1模式可以使用断言来执行约束,方法是将PersonalInfo的声明更改为如下所示:
<xs:element name="PersonalInfo">
<xs:complexType>
<xs:sequence>
<xs:element ref="State"/>
<xs:element ref="Car"/>
</xs:sequence>
<xs:assert test="
(State = 'RI' and Car/AntiLockBrakes = 'Y')
or
(State = ('NC', 'CT') and Car/AntiLockBrakes = 'ABS')
"/>
</xs:complexType>
</xs:element>xs: assertion 'test‘属性中的断言是使用XPath 2.0表示的;正如您可能预期的那样,可以使用多种方法来表示它。
Schematron的工作方式类似,但是Schematron本身并没有指定用来表示测试的语言;很容易找到支持用XPath 1.0编写的断言或接受XPath 2.0的Schematron实现。
https://stackoverflow.com/questions/15315192
复制相似问题