根据其他XML字段的值在XSD中设置minOccurs和maxOccurs?
我有一个XSD来验证XML文件。结构如下:根据其他XML字段的值在XSD中设置minOccurs和maxOccurs?,xml,xsd,xsd-validation,xml-validation,Xml,Xsd,Xsd Validation,Xml Validation,我有一个XSD来验证XML文件。结构如下: <root> <child> <size>2</size> <childElement>Element 1</childElement> <childElement>Element 2</childElement> </child> </root> 有没有一种方法可以使
<root>
<child>
<size>2</size>
<childElement>Element 1</childElement>
<childElement>Element 2</childElement>
</child>
</root>
有没有一种方法可以使用
xs:alternative
或其他标记来实现这一点,或者这超出了XSD的可能范围?设计建议:如果您的XML设计仍然可以更改,请删除size
元素,并隐式而非显式地传递该信息。通过消除信息的重复,您无需检查重复是否一致
如果您的XML设计仍然无法更改,或者您选择不更改它
XSD 1.0
不可能。必须进行带外wrt XSD检查
XSD 1.1
可能使用xs:assert
:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="child">
<xs:complexType>
<xs:sequence>
<xs:element name="size" type="xs:integer"/>
<xs:element name="childElement" maxOccurs="unbounded"/>
</xs:sequence>
<xs:assert test="count(childElement) = size"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
非常有趣的用例。但我从未见过这样的事。您需要在解析器I中进行验证think@DavidBrossard:适用于XSD 1.0;对于XSD1.1,xs:assert
。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="child">
<xs:complexType>
<xs:sequence>
<xs:element name="size" type="xs:integer"/>
<xs:element name="childElement" maxOccurs="unbounded"/>
</xs:sequence>
<xs:assert test="count(childElement) = size"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>