我有一个XSD来验证XML文件。结构如下:
<root>
<child>
<size>2</size>
<childElement>Element 1</childElement>
<childElement>Element 2</childElement>
</child>
</root>
childElement
的数量取决于提供的大小,即如果size
设置为3,则可以添加不超过3 childElement
。
我尝试使用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的可能范围?
答案 0 :(得分:3)
设计建议:如果您的XML设计仍然可以更改,请删除size
元素并隐式传达该信息,而不是显式传达。通过消除重复信息,您无需检查复制是否一致。
如果您的XML设计仍无法更改,或者您选择不更改它......
不可能。必须在XSD外带外检查。
可以使用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>