2012-07-10 85 views
2

我的架构中的这一部分给我找麻烦:定义XSD架构元素的列表

 <xs:element name="newrecipients"> 
      <xs:complexType> 
       <xs:choice> 
        <xs:element name="csv" type="xs:string" /> 
        <!-- List of recipients --> 
       </xs:choice> 
      </xs:complexType> 
     </xs:element> 

收件人列表就像是事情的清单:

<recipient> 
    <field1>...</field1> 
    ... 
    <fieldN>...</field> 
</recipient> 

其中标签收件人可能包含模式未知的随机标签序列。所以我用了类似

<xs:element name="recipient"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:any minOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

问题是我没有如何定义收件人列表。我知道<xs:list>但我不知道如何在这种情况下使用它,因为我通常看到类似

<xs:element name="intvalues" type="valuelist"> 

<xs:simpleType name="valuelist"> 
    <xs:list itemType="xs:integer"/> 
</xs:simpleType> 

</xs:schema> 

,你必须定义一个包含列表中的一个元素。我想直接csv或直接list

我错过了什么?谢谢。

编辑:输出例如

此:

<newrecipients> 
    <csv>myrecipients.csv</csv> 
</newrecipients> 

或本:

<newrecipients> 
    <recipient> 
     <field1>...</field1> 
     ... 
     <fieldN>...</field> 
    </recipient> 
    ... 
    <recipient> 
     <field1>...</field1> 
     ... 
     <fieldN>...</field> 
    </recipient> 
</newrecipients> 

回答

3

我不知道,如果它是无效的xsd:choice的元素:

<xs:element name="newrecipients"> 
    <xs:complexType> 
     <xs:choice> 
      <xs:element name="csv" type="xs:string" /> 
      <!-- List of recipients --> 
      <xs:element name="recipient" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:any minOccurs="1"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:choice> 
    </xs:complexType> 
</xs:element> 

当然您可以使用此解决方案将元素声明包装在xsd:sequence标记中,但是我不知道是否希望列表存在当且仅当csv元素丢失时。

+0

谢谢你的回答。我添加了一个我想要的例子。我想用你的例子,我可以只有一个收件人标签,因为它是一种选择? – dierre 2012-07-11 08:18:27

+0

我发现这个例子:http://xmlzoo.net/xsd/?xml=16q.xml 从那里陈述,似乎即使你有一个xsd:选择,你仍然可以指定某个元素可以重复几次将maxOccurs值设置为无限制。所以解决方案应该工作。 – user1187008 2012-07-11 08:28:15