XSD架构:在xs:all下引用的元素上发生MaxOccurs



问题是我使用XS:all是因为元素可以按任何顺序排列。我不能将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并在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。然而我发现了一个有帮助的线程:XSD all和XSD序列之间的中间路径

XSD1.1中删除了对xs:all上maxOccurs="1"的限制。您是否可以选择使用XSD 1.1处理器?据我所知,目前有三个:撒克逊人、薛西斯人和阿尔托娃人。

如果这个元素没有被引用,我就能逃脱惩罚使用ComplexType

否,在xs:all下的xs:element上仍然不能有maxOccurs="unbounded"

有没有任何方法可以引用元素并在xs:全部?

否,xs:all下的xs:element只能是0或1。


评论中关于xs:choice想法的更新

我可以使用xs:choice并创建元素,而不是引用现有的一个(不理想,因为参考使用多个点)。我是试图弄清楚是否有一种方法可以使用对元素具有CCD_ 7。

如果您的首要任务是避免排序,并且仍然允许在PersonInfo下使用多个Addr元素,是的,您可以将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也可以重复出现。如果您希望探索其他组合,请参阅xsd:choice中元素的minOccurs和maxOccurs,了解如何在xsd:choice及其xsd:element子级上解释maxOccurs。最后,您可以在一组有序的元素之前或之后分离xs:all元素,其中您可以允许基数大于1。

最新更新