是否可以定义包含属性组的元素组?

时间:2014-07-27 06:09:44

标签: xsd

我正在定义一个包含多个复杂元素的xsd,它们在不同元素下重复相似的结构。 样品:

<keys>
  <add-key>
    <add key="new key" value="v1">
  </add-key>
  <del-key>
    <add key="bad key" value="v2">
  </del-key>
</keys>

定义以下内容的正确方法是什么?我在使用这段代码时无法解析模式。

<xs:complexType name="keyType">
  <xs:sequence maxOccurs="unbounded">
    <xs:element name="add">
      <xs:complexType>
        <xs:attributeGroup ref="keyAttributeGroup"/>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType> 

<xs:attributeGroup name="keyAttributeGroup">
  <xs:attribute name="key" type="xs:string" use="required"/>
  <xs:attribute name="value" type="xs:string" use="required"/>
</xs:attributeGroup>

1 个答案:

答案 0 :(得分:2)

如果您事先知道类型keyType 元素可能具有(add-key, del-key)的所有名称,那么可能的解决方案是使用一个未命名的选择

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="keys">
        <xs:complexType>
                <xs:choice maxOccurs="unbounded">
                    <xs:element name="add-key" type="keyType" />
                    <xs:element name="del-key" type="keyType" />
                </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="keyType">
        <xs:sequence maxOccurs="unbounded">
            <xs:element name="add">
                <xs:complexType>
                    <xs:attributeGroup ref="keyAttributeGroup" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:attributeGroup name="keyAttributeGroup">
        <xs:attribute name="key" type="xs:string" use="required" />
        <xs:attribute name="value" type="xs:string" use="required" />
    </xs:attributeGroup>
</xs:schema>

如果元素可以有任何随机名称(add-key, del-key, whatever),那么我知道最接近的解决方案是使用xs:any