2014-07-27 114 views
1

我定义了一个包含多个复杂元素的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> 

回答

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

+0

这绝对是一个有趣的方式来看待它!虽然,我正在寻找一种方法来定义一个元素组,每个元素下将有一个属性组。我提供的例子是我面临的一般问题的一个独特案例。但是,我必须再次说你的答案很棒! – Asaf

相关问题