我必须使用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元素接受字符串或整数,则为其分配一个类型,该类型是整数和字符串的并集。顺序很重要,因为第一个匹配项决定了如何在架构验证后的信息集中键入元素值。

09-27 00:17
查看更多