我有一个XSD来验证XML文件。结构如下:
<root>
<child>
<size>2</size>
<childElement>Element 1</childElement>
<childElement>Element 2</childElement>
</child>
</root>
childElement
s的数量取决于所提供的大小,即如果size
设置为3,则不能添加超过3个childElement
s。
我已经尝试使用xs:alternative
,但它似乎不工作:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="child" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="size" type="xs:integer" maxOccurs="1"/>
<xs:element name="childElement" type="xs:string" maxOccurs="1">
<xs:alternative test="@size>1" maxOccurs="@size"/>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
是否有一种方法使用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>