XML 架构 - maxOccurs="unbounded" 的元素包含多个可接受的类型

问题描述 投票:0回答:3

是否可以为 maxOccurs="unbounded" 的元素创建 XSD 架构,该元素接受不同的值类型作为其项目?例如:

<myArray>
    <A>first</A>
    <A>second</A>
    <A>third</A>
    <B>fourth</B>
    <B>fifth</B>
</myArray>

如果不是,是否是一种非标准类型的 XML 结构设计?

XHTML 中也类似:

<body>
    <p></p>
    <br />
    <img />
</body>

这是否意味着xhtml不标准?

更新: maxOccurs="unbounded" 以前称为“数组元素”

xml xsd uml
3个回答
3
投票

嗯,我通过使用 xsd refs 找到了方法。 结论:这是可能的,XHTML 是标准。

“myArray”的架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="A" type="xs:string" />
    <xs:element name="B" type="xs:string" />
    <xs:element name="myArray">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="A" minOccurs="0" maxOccurs="unbounded" />
                <xs:element ref="B" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

1
投票

XSD 不会将任何元素类别识别为“数组元素”,因此并不完全清楚您的问题的含义。 XSD 中不要求元素的所有子元素具有相同的名称或相同的类型。

XSD 确实要求,通过“元素声明一致”约束,具有相同名称的任何两个同级具有相同的类型(或兼容类型,由一些相当密集和复杂的散文定义的“兼容性”)。

由于异构数组在某些编程语言中造成困难,我可以想象一些程序员希望设计他们的 XML 以避免映射到异构数组的构造。但 XHTML 的设计绝不是非标准的。


0
投票

最好使用以下 xsd 解决方案。因为这样也可以混合元素和 的顺序。

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="myArray">
  <xs:complexType>
    <xs:sequence>
      <xs:group ref="ElementGroup" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence>
  </xs:complexType>
</xs:element>   
  
  <xs:group name="ElementGroup">
    <xs:choice>
      <xs:element name="A" type="xs:string"/>
      <xs:element name="B" type="xs:string"/>
    </xs:choice>
  </xs:group>
  
</xs:schema>

以下 xml 也是可以的:

<myArray>
    <A>first</A>
    <A>second</A>
    <A>third</A>
    <B>fourth</B>
    <B>fifth</B>
    <A>sixth</A>
    <B>seventh</B>
</myArray>
© www.soinside.com 2019 - 2024. All rights reserved.