我想要使用XSD验证XML。它实际上是一个简单的场景,但我找不到正确的答案。这是XML:
<data>
<point>
<x>count</x>
<y>218</y>
</point>
<point>
<x>maxtime</x>
<y>1</y>
</point>
<point>
<x>mintime</x>
<y>0</y>
</point>
<point>
<x>mean</x>
<y>0.11</y>
</point>
</data>
我想确保 data 元素包含4个 point 元素,并且只有一个 x 元素= 计算,只有一个 x = maxtime ...
我现在拥有以下内容:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element name="point" type="ctPoint" minOccurs="1" maxOccurs="4" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ctPoint">
<xs:sequence minOccurs="1" maxOccurs="4">
<xs:element name="x" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="count" />
<xs:enumeration value="maxtime" />
<xs:enumeration value="mintime" />
<xs:enumeration value="mean" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="y" type="xs:decimal" minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
这样可以正确验证,但不能保证只有1个计数,只有1个最大值,...
答案 0 :(得分:2)
I want to make sure that the data element contains 4 point elements
您可以使用XSD 1.0&{39} minOccurs="4"
和maxOccurs="4"
进行此约束。
并且只有一个x元素= count,只有一个x = MAXTIME ...
如果您使用XSD 1.0,则必须在带外(代码中)执行此约束。
[更新:但是,如果目的只是让所有 x
值都是唯一的,请参阅@ sergioFC&#39; s good XSD 1.0 idea about xs:unique
在data
内。]
如果您可以使用 XSD 1.1 ,正如@lexicore建议的那样,它会起作用。使用xs:assert
:
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element name="point" type="ctPoint" minOccurs="4" maxOccurs="4" />
</xs:sequence>
<xs:assert test="count(point[x = 'count']) = 1 and
count(point[x = 'maxtime']) = 1"/>
</xs:complexType>
</xs:element>
答案 1 :(得分:1)
您可以使用 xs:uniqe ,其中在XSD 1.0中也有效。
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element name="point" type="ctPoint" minOccurs="1" maxOccurs="4" />
</xs:sequence>
</xs:complexType>
<xs:unique name="myUnique">
<!-- Select all points in data -->
<xs:selector xpath="point" />
<!-- The value of x of every selected point should be unique -->
<xs:field xpath="x" />
</xs:unique>
</xs:element>
此外,为了做到这一点,我认为你应该改变 minOccurs ,就像用户kjhughes在他的回答中所说的那样。