XML模式,为什么xs:group不能是xs:all的子项?

时间:2015-11-13 17:32:19

标签: xml xslt xsd

根据this page(以及我的惯例),xs:group元素不能是xs:all的子元素。 像

这样的东西
<xs:group name="g">
    <xs:element name="first" type="xs:string"/>
    <xs:element name="last" type="xs:string"/>
</xs:group>
<xs:all>
    <xs:group ref="g" minOccurs="0" maxOccurs="1"/>
    <xs:element name="id" type="xs:string"/>
</xs:all>

无效,因为群组不能在xs:all内。但我想定义一个模式,其中两个元素(上例中的firstlast)都存在,或者它们都不存在,所以我将它们组成一个组。然后我想使组成为xs:all的一部分,因为该组可以按任何顺序与其他元素(例如,上面的id元素)一起出现。换句话说,我希望有几个元素作为整个组是可选的。如果xs:group无法成为xs:all的孩子,我该如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

xs:element下的

XML Schema 1.0 only permits xs:annotation(以及xs:all)。

<all
  id = ID
  maxOccurs = 1 : 1
  minOccurs = (0 | 1) : 1
  {any attributes with non-schema namespace . . .}>
  Content: (annotation?, element*)
</all>

不允许xs:groupxs:sequencexs:choice等。

xs:element下的

XML Schema 1.1 permits xs:anyxs:groupxs:all

<all
  id = ID
  maxOccurs = (0 | 1) : 1
  minOccurs = (0 | 1) : 1
  {any attributes with non-schema namespace . . .}>
  Content: (annotation?, (element | any | group)*)
</all>

注意:允许无序元素可能听起来很理想但很少真正需要。通常xs:sequence在实践中就足够了。

如果您愿意放弃无序要求,您可以(即使在XSD 1.0中)要求firstlast至&#34;两者都存在或两者都不存在&#34;如下:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="a">
    <xs:complexType>
      <xs:sequence>
        <xs:sequence minOccurs="0">
          <xs:element name="first" type="xs:string"/>
          <xs:element name="last" type="xs:string"/>
        </xs:sequence>
        <xs:element name="id" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>