2012-12-28 31 views
1

我不能完全肯定,如果我使用的是正确的流程或者即使是可能的,但是我想要做的就是创建一个定义以下架构XSL文件:XSD条件分组

<data> 
    <s> 
     <name>Joe Blogs</name> 
     <id>1235</id> 
     <aa>data</aa> 
     <ab>data</ab> 
     <ad>data</ad> 
     <ae>data</ae> 
    </s> 
    <s> 
     <name>Jane Blogs</name> 
     <id>1234</id> 
     <ba>data</ba> 
     <bb>data</bb> 
    </s> 
    <s> 
     <name>Jane Blogs</name> 
     <id>1234</id> 
     <aa>data</aa> 
     <ac>data</ac> 
     <ad>data</ad> 
     <ae>data</ae> 
    <s> 
</data> 

所以基本上:

  • <data>标记是根。它可以是空的。
  • <s>标签可以出现多次。
    • <ba>标签必须由标签<bb>被acompanied。
    • <aa>标签必须由标签<ad><ae>陪同。
      • 标签<ab>只有在<aa>(及相关标签)存在时才会出现,但不能出现在<ac>和vica-verca。

我试图用元素来实现这一点:

<xs:schema version="1.0" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified"> 

    <xs:element name="data"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="s" 
        maxOccurs="unbounded" 
        minOccurs="0"> 
      <xs:complexType> 
      <xs:choice> 
       <xs:sequence> 
       <xs:element name="name"/> 
       <xs:element name="id"/> 
       <xs:element name="aa"/> 
       <xs:element name="ab"/> 
       <xs:element name="ad"/> 
       <xs:element name="ae"/> 
       </xs:sequence> 
       <xs:sequence> 
       <xs:element name="name"/> 
       <xs:element name="id"/> 
       <xs:element name="aa"/> 
       <xs:element name="ac"/> 
       <xs:element name="ad"/> 
       <xs:element name="ae"/> 
       </xs:sequence> 
       <xs:sequence> 
       <xs:element name="name"/> 
       <xs:element name="id"/> 
       <xs:element name="ba"/> 
       <xs:element name="bb"/> 
       </xs:sequence> 
      </xs:choice> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

任何帮助将不胜感激。

回答

1

你靠近。问题是,鉴于您当前的声明,XSD验证程序在它看到最初的name元素时并不知道它指定了它指定的三个序列中应选择哪一个。不允许在投入中预先作出选择;它必须能够在没有前瞻的情况下浏览内容模型。

重整你的复杂类型这种方式消除了这一问题。

<xs:complexType> 
    <xs:sequence> 
    <xs:element name="name"/> 
    <xs:element name="id"/> 
    <xs:choice> 
     <xs:sequence> 
     <xs:element name="ba"/> 
     <xs:element name="bb"/> 
     </xs:sequence> 
     <xs:sequence> 
     <xs:element name="aa"/> 
     <xs:choice> 
      <xs:element name="ab"/> 
      <xs:element name="ac"/>     
     </xs:choice> 
     <xs:element name="ad"/> 
     <xs:element name="ae"/> 
     </xs:sequence> 
    </xs:choice> 
    </xs:sequence> 
</xs:complexType> 

正如你所看到的,我所做的只是将你的选择中的通用前缀分解出来,并将它们放在选择点之前。

+0

谢谢你这么多,你是一个生命的救星。 – Lee