XSD元素与元素不一致

时间:2016-02-10 14:23:23

标签: xml xsd xsd-1.1

我必须使用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 - 解决方案的原因。

感谢您的帮助!

修改 为了绕过uuid的模糊性,这个例子中的顺序并不重要。 &LT; UUID&GT;可以是例如最后一个元素。

1 个答案:

答案 0 :(得分:1)

任何两个具有相同名称和相同父的元素必须在XSD中具有相同的类型。这就是&#39;元素声明一致的本质&#39;约束。从错误的措辞来看,我相信XML Spy告诉你,你违反了这个约束。 (您还违反了“独特的粒子归因&#39;约束。”

如果希望uuid元素接受字符串或整数,请为其指定一个整数和字符串联合的类型。顺序很重要,因为匹配的第一个决定了如何在后架构验证信息集中键入元素值。