问题是我使用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:choice
与maxOccurs="unbounded"
:一起使用
<xs:choice maxOccurs="unbounded">
<xs:element name="Addr" type="AdressType"/>
<xs:element name="e1"/>
<xs:element name="e2"/>
</xs:choice>
然而,注意,与xs:all
不同,这里可以省略Addr
或e1
或e2
。在该特定配置中,e1
和e2
也可以重复出现。如果您希望探索其他组合,请参阅xsd:choice中元素的minOccurs和maxOccurs,了解如何在xsd:choice
及其xsd:element
子级上解释maxOccurs
。最后,您可以在一组有序的元素之前或之后分离xs:all
元素,其中您可以允许基数大于1。