元素(可能也包括
TL;DR
XSD是否要求属性必须遵循<xsd:choice />
元素(可能也包括<xs:sequence />
)?如果是这样的话,我在哪里可以找到这些信息,因为我一直无法找到它?
全版
我正在编写我的第一个XSD来验证XML文件。当我使用FreeFormatter.com上的XML对XSD验证我的XML时,我会得到以下错误:
S4s-ELT-无效-内容1:'#AnonType_Container‘的内容无效。元素‘选择’是无效的,错误的,或者发生得太频繁。
但是,如果我更改了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>
发布于 2016-09-08 07:51:01
是的,xsd:attribute
必须遵循,而不是在xsd:choice
之前。这是XSD的W3C推荐的一部分--而不是您正在使用的XSD处理器的特性。
有关建议中涉及以下内容的部分,请参见3.4.2复杂类型定义的XML表示:
<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>
https://stackoverflow.com/questions/39394848
复制