XSD架构:xs:all下引用元素的MaxOccurs

时间:2015-02-24 14:46:41

标签: xml xsd xsd-validation

问题是我使用的是XS:所有因为元素可以是任何顺序。我不能在引用的元素上放置maxoccurs:

    <xs:element name="PersonInfo">
    <xs:complexType>
        <xs:all>
            <xs:element name="Addr" type="AdressType" minOccurs="0" maxOccurs="unbounded" />

        </xs:all>
        <xs:attribute name="id" type="xs:ID" use="optional" />
        <xs:attribute name="Test" type="xs:string" use="optional" />

    </xs:complexType>
</xs:element>

<xs:complexType name="AdressType">
    <xs:all>
        <xs:element name="BuildingAptNumber" type="xs:string" minOccurs="0" />
        <xs:element name="Addr1" type="xs:string" minOccurs="0" />
        <xs:element name="City" type="xs:string" minOccurs="0" />
        <xs:element name="StateProvCd" type="xs:string" minOccurs="0" />
        <xs:element name="PostalCode" type="xs:string" minOccurs="0" />
    </xs:all>
    <xs:attribute name="AddrTypeCd" type="xs:string" use="optional" />
</xs:complexType>

如果未引用该元素,我将能够使用ComplexType。有没有办法引用该元素并在xs:all?

下有一个maxoccurs

编辑:我看到添加maxoccurs的唯一方法是使用complextype并在复杂类型中定义xs:choice:

        <xs:element name="Test" minOccurs="0">
                <xs:complexType>
                    <xs:choice maxOccurs="unbounded">
                        <xs:element name="Addr" type="PMICADDRESS"/>
                    </xs:choice>
                </xs:complexType>

            </xs:element>

所以问题是我不知道如何声明addr元素的复杂类型。我找到的一个解决方案是更改为xsd 1.1。我无法更新到XSD 1.1。然而。我找到了一个有用的帖子:Middle way between XSD all and XSD sequence

2 个答案:

答案 0 :(得分:2)

对maxOccurs的限制=&#34; 1&#34; on xs:all在XSD 1.1中删除。您可以选择使用XSD 1.1处理器吗?据我所知,目前有三种:Saxon,Xerces和Altova。

答案 1 :(得分:1)

  

如果没有引用该元素,我将能够逃脱   使用ComplexType

不,你maxOccurs="unbounded"下的xs:element仍然无法xs:all

  

有没有办法引用该元素并在其下有一个maxoccurs   xs:all?

不,xs:element下的xs:all可能只有0或1。


关于xs的更新:评论中的选择理念

  

我可以使用xs:choice并创建元素而不是引用   现有的(不适合作为参考使用多个点)。我是   试图找出是否有办法使用引用   元素xs:choice

如果您的首要任务是避免排序并仍然允许Addr下的多个PersonInfo元素,是的话,您可以将xs:choicemaxOccurs="unbounded"一起使用:

  <xs:choice maxOccurs="unbounded">
    <xs:element name="Addr" type="AdressType"/>
    <xs:element name="e1"/>
    <xs:element name="e2"/>
  </xs:choice>

但请注意,与xs:all不同,此处Addre1e2可以省略。在此特定配置中,e1e2也可能重复出现。如果您想探索其他组合,请参阅minOccurs and maxOccurs on elements inside xsd:choice了解如何解释maxOccurs及其xsd:choice个孩子的xsd:element。最后,您可以在一组有序的元素之前或之后隔离xs:all元素,其中您可以允许基数大于1。