我必须使用XSD验证XML。
XML可能如下所示:
<content>
<uuid>1234</uuid>
<type>group1</type>
... some more elements
</content>
XML也可能如下所示:
<content>
<uuid>asdf</uuid>
<type>group2</type>
... some other elements which may differ from the first XML
</content>
在第一个XML中,uuid的类型为
xs:integer
。在第二个XML中,uuid的类型为xs:string
。为了在XSD中验证这些XML,我决定在
groups
中使用choice
。我的XSD看起来像这样:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
<xs:element name="content">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:group ref="group1"/>
<xs:group ref="group2"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:group name="group1">
<xs:sequence>
<xs:element name="uuid" type="xs:integer"/>
... some more elements
</xs:sequence>
</xs:group>
<xs:group name="group2">
<xs:sequence>
<xs:element name="uuid" type="xs:string"/>
... some more elements which may differ from the first XML
</xs:sequence>
</xs:group>
</xs:schema>
使用XMLSpy时,出现以下错误:
Element 'uuid' is not consistent with element 'uuid'.
是的,它们不一致,但这正是我想要的:-)
因此,我该如何更改XSD,以便可以在不同的组中以相同的选择使用相同的元素,并且使用不同的类型? uuid不是唯一的元素,可能会有所不同,这就是为什么我实现了
group
-solution的原因。感谢您的帮助!
编辑
为了绕过uuid的歧义,此示例中的顺序并不重要。 可以是最后一个元素。
最佳答案
具有相同名称和相同父项的任何两个元素在XSD中必须具有相同的类型。这就是“元素声明一致”约束的本质。从错误的措辞来看,我相信XML Spy告诉您您违反了该约束。 (您还违反了“唯一粒子归因”约束。
如果希望您的uuid
元素接受字符串或整数,则为其分配一个类型,该类型是整数和字符串的并集。顺序很重要,因为第一个匹配项决定了如何在架构验证后的信息集中键入元素值。