XML 验证:XSD 中的并发无序和出现要求
XML validation: Concurrent unordered and occurrence requirements in XSD
在XML Schema (XSD 1.0)中,我对四个元素有以下要求:
- element1 总是最先出现,minOccurs = 0 且 maxOccurs = 1
- element2 将出现 minOccurs = 0 和 maxOccurs = 1
- element3 将出现 minOccurs = 0 和 maxOccurs = unbounded
- element2 和 element3 将以任意顺序出现(在 element1 之后和 element4 之前)
- element4 将始终出现在最后,minOccurs = 0 且 maxOccurs = unbounded
- 所有这些元素都是 parent_element 的子元素,并且它们的 minOccurs = 0,但至少其中 1 个应该出现在父元素。
我创建了一个满足所有要求的方案,除了 #2 和 #6。在我的模式中,element2 和 element3 可以以任何顺序出现,但我无法限制 element2 只出现一次。此外,我无法确保 parent_element 中至少存在 1 个元素。
查看下面的架构并提出更新建议以满足上述所有要求。
<xs:element name="parent_element">
<xs:complexType>
<xs:sequence>
<xs:element name="element1" type="type1" minOccurs="0" maxOccurs="1" />
<xs:choice minOccurs="0" maxOccurs="unbounded" >
<xs:element name="element2" type="type1" />
<xs:element name="element3" type="type1" />
</xs:choice>
<xs:element name="element4" type="type2" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
为了满足要求#2,我尝试了将 maxOccurs="1"
与 element2(内部选择)一起使用的技巧,但它不起作用,并且 element2 仍然能够以任何顺序与 element3 重复多次.
<xs:element name="parent_element">
<xs:complexType>
<xs:sequence>
<xs:element name="element1" type="type1" minOccurs="0" maxOccurs="1" />
<xs:choice minOccurs="0" maxOccurs="unbounded" >
<xs:element name="element2" type="type1" maxOccurs="1" />
<xs:element name="element3" type="type1" />
</xs:choice>
<xs:element name="element4" type="type2" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
要求 #4 和 #6 禁止使用 XSD 1.0。
XSD 1.1 可以通过 xs:assert
:
满足这些要求
XSD 1.1 解决方案
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
elementFormDefault="qualified"
vc:minVersion="1.1">
<xs:element name="parent_element">
<xs:complexType>
<xs:sequence>
<xs:element name="element1" minOccurs="0" maxOccurs="1" />
<xs:choice minOccurs="0" maxOccurs="unbounded" >
<xs:element name="element2" />
<xs:element name="element3" />
</xs:choice>
<xs:element name="element4" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:assert test="count(element2) < 2
and (element1 or element2 or element3 or element4)"/>
</xs:complexType>
</xs:element>
</xs:schema>
在XML Schema (XSD 1.0)中,我对四个元素有以下要求:
- element1 总是最先出现,minOccurs = 0 且 maxOccurs = 1
- element2 将出现 minOccurs = 0 和 maxOccurs = 1
- element3 将出现 minOccurs = 0 和 maxOccurs = unbounded
- element2 和 element3 将以任意顺序出现(在 element1 之后和 element4 之前)
- element4 将始终出现在最后,minOccurs = 0 且 maxOccurs = unbounded
- 所有这些元素都是 parent_element 的子元素,并且它们的 minOccurs = 0,但至少其中 1 个应该出现在父元素。
我创建了一个满足所有要求的方案,除了 #2 和 #6。在我的模式中,element2 和 element3 可以以任何顺序出现,但我无法限制 element2 只出现一次。此外,我无法确保 parent_element 中至少存在 1 个元素。
查看下面的架构并提出更新建议以满足上述所有要求。
<xs:element name="parent_element">
<xs:complexType>
<xs:sequence>
<xs:element name="element1" type="type1" minOccurs="0" maxOccurs="1" />
<xs:choice minOccurs="0" maxOccurs="unbounded" >
<xs:element name="element2" type="type1" />
<xs:element name="element3" type="type1" />
</xs:choice>
<xs:element name="element4" type="type2" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
为了满足要求#2,我尝试了将 maxOccurs="1"
与 element2(内部选择)一起使用的技巧,但它不起作用,并且 element2 仍然能够以任何顺序与 element3 重复多次.
<xs:element name="parent_element">
<xs:complexType>
<xs:sequence>
<xs:element name="element1" type="type1" minOccurs="0" maxOccurs="1" />
<xs:choice minOccurs="0" maxOccurs="unbounded" >
<xs:element name="element2" type="type1" maxOccurs="1" />
<xs:element name="element3" type="type1" />
</xs:choice>
<xs:element name="element4" type="type2" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
要求 #4 和 #6 禁止使用 XSD 1.0。
XSD 1.1 可以通过 xs:assert
:
XSD 1.1 解决方案
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
elementFormDefault="qualified"
vc:minVersion="1.1">
<xs:element name="parent_element">
<xs:complexType>
<xs:sequence>
<xs:element name="element1" minOccurs="0" maxOccurs="1" />
<xs:choice minOccurs="0" maxOccurs="unbounded" >
<xs:element name="element2" />
<xs:element name="element3" />
</xs:choice>
<xs:element name="element4" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:assert test="count(element2) < 2
and (element1 or element2 or element3 or element4)"/>
</xs:complexType>
</xs:element>
</xs:schema>