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: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>
答案 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>