2011-01-26 36 views
1

我有一些XML,你可以有根据属性进行选择的最简洁的方法是什么?

<a type="b"> 
    <b></b> 
</a> 

<a type="c"> 
    <c></c> 
</a> 

<a type="d"> 
    <d></d> 
</a> 

但是下面是无效:

<a type="c"> 
    <b></b> 
</a> 

我想创造一个表示这一点的XML Schema,但是,如果我理解正确,则以下内容不能正确地将type属性与标记的内容绑定。

<?xml version="1.0" encoding="UTF-8" ?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="a" type="A" minOccurs="1" maxOccurs="1" /> 

    <xs:complexType name="A"> 
     <xs:attribute name="type" type="AType" use="required" /> 
     <xs:choice> 
      <xs:group ref="B" /> 
      <xs:group ref="C" /> 
      <xs:group ref="D" /> 
     </xs:choice> 
    </xs:complexType> 

    <xs:simpleType name="AType"> 
     <restriction base="xs:string"> 
      <enumeration value="b"/> 
      <enumeration value="c"/> 
      <enumeration value="d"/> 
     </restriction> 
    </xs:simpleType> 

    <xs:complexType name="B"> 
     STUFF 
    </xs:complexType> 

    <xs:complexType name="C"> 
     OTHER STUFF 
    </xs:complexType> 

    <xs:complexType name="D"> 
     YET MORE STUFF 
    </xs:complexType> 
</xs:schema> 

是要正确做到这一点是令人难以置信的冗长喜欢的唯一途径:

<?xml version="1.0" encoding="UTF-8" ?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="a" type="A" minOccurs="1" maxOccurs="1" /> 

    <xs:complexType name="A"> 
     <xs:choice> 
      <xs:group ref="B" /> 
      <xs:group ref="C" /> 
      <xs:group ref="D" /> 
     </xs:choice> 
    </xs:complexType> 

    <xs:complexType name="B"> 
     <xs:attribute name="type" type="xs:string" fixed="b" /> 
     STUFF 
    </xs:complexType> 

    <xs:complexType name="C"> 
     <xs:attribute name="type" type="xs:string" fixed="c" /> 
     OTHER STUFF 
    </xs:complexType> 

    <xs:complexType name="D"> 
     <xs:attribute name="type" type="xs:string" fixed="d" /> 
     YET MORE STUFF 
    </xs:complexType> 
</xs:schema> 
+0

您使用XML并抱怨冗长? (zing!SCNR)好吧,严肃地说:您是否尝试过对A/B/C标签组使用不同的父标签?基于这个属性对我来说似乎不太常见(或明智)... – delnan 2011-01-26 16:12:35

回答

2

有没有在XSD 1.0这样做的直接方式。使用“条件类型分配”的新功能,可以在XSD 1.1中轻松完成。 Saxon和Xerces附带的模式处理器的最新版本支持此功能。

相关问题