关于<xs:choice>和<xs:attribute>元素的顺序的XSD错误

时间:2016-09-08 15:25:08

标签: xml xsd

TL; DR

XSD是否要求属性必须遵循<xsd:choice />元素 (也可能是<xs:sequence />)?如果是这样,我在哪里可以找到它 信息,因为我无法找到它?

完整版

我正在编写第一个XSD来验证XML文件。当我验证我的XML时 使用XML Validator at FreeFormatter.com对抗我的XSD,我得到了 以下错误:

  

S4s-elt-invalid-content.1:&#39;#AnonType_Container&#39;的内容是无效的。   元素选择&#39;无效,错位或太频繁发生。

但是,如果我更改了XSD,那么Container中的这一行 说明书

<xs:attribute name="Name" type="xs:ID" use="required" />

跟在<xs:choice />元素之后,而不是在它前面,它起作用 预期

我的问题是:

  • XSD Schema的要求是属性必须遵循 <xsd:choice />元素(也可能是<xsd:sequence />, 虽然我还没有确认这会失败),或者这是一个怪癖 验证员我正在使用?
  • 如果这是一项要求,我在哪里可以找到与此相关的信息 没有能找到任何东西。

MCVE生成此错误。

XML

<?xml version="1.0" encoding="UTF-8"?>

<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="document.xsd">
    <Container Name="Container">
        <Bar a="bar" />
        <Foo a="foo" />
    </Container>
</Document>

非工作XSD

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!-- Base type. -->
    <xs:complexType name="base_t">
        <xs:attribute name="a" type="xs:string" use="required" />
    </xs:complexType>

    <!-- Elements. -->
    <xs:element name="Foo" type="base_t" />
    <xs:element name="Bar" type="base_t" />
    <xs:element name="Baz" type="base_t" />

    <!-- Container definition. -->
    <xs:element name="Container">
        <xs:complexType>
            <xs:attribute name="Name" type="xs:ID" use="required" />
            <xs:choice minOccurs="1" maxOccurs="unbounded">
                <xs:element ref="Foo" />
                <xs:element ref="Bar" />
                <xs:element ref="Baz" />
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <!-- Document definition. -->
    <xs:element name="Document">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Container" minOccurs="1" maxOccurs="1" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

使用XSD

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!-- Base type. -->
    <xs:complexType name="base_t">
        <xs:attribute name="a" type="xs:string" use="required" />
    </xs:complexType>

    <!-- Elements. -->
    <xs:element name="Foo" type="base_t" />
    <xs:element name="Bar" type="base_t" />
    <xs:element name="Baz" type="base_t" />

    <!-- Container definition. -->
    <xs:element name="Container">
        <xs:complexType>
            <xs:choice minOccurs="1" maxOccurs="unbounded">
                <xs:element ref="Foo" />
                <xs:element ref="Bar" />
                <xs:element ref="Baz" />
            </xs:choice>
            <xs:attribute name="Name" type="xs:ID" use="required" />
        </xs:complexType>
    </xs:element>

    <!-- Document definition. -->
    <xs:element name="Document">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Container" minOccurs="1" maxOccurs="1" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

1 个答案:

答案 0 :(得分:2)

是的,xsd:attribute必须 关注 ,而不是先于xsd:choice。这是W3C Recommendation for XSD的一部分 - 不是你正在使用的XSD处理器的特质。

有关此内容的建议部分,请参阅3.4.2 XML Representation of Complex Type Definitions

<complexType
  abstract = boolean : false
  block = (#all | List of (extension | restriction)) 
  final = (#all | List of (extension | restriction)) 
  id = ID
  mixed = boolean : false
  name = NCName
  {any attributes with non-schema namespace . . .}>
  Content: (annotation?, 
            (simpleContent | complexContent | 
             ((group | all | choice | sequence)?,
              ((attribute | attributeGroup)*, anyAttribute?))))
</complexType>