首页 > 解决方案 > 我如何重用复杂类型来定义自身的序列(XML 模式)

问题描述

我是 xml 架构的新手。我必须手动转换一个 dtd 文件。这是其中两条线

<!ENTITY % field "a|b|c">
<!ELEMENT article (%field;)*>

我想定义与 (a|b|c) 等效的复杂类型,以及与 (a|b|c)* 等效的复杂类型,而无需重写代码。我定义 (a|b|c) 的方式是

<xs:complexType name="abc">
    <xs:choice>
        <xs:element ref="a"/>
        <xs:element ref="b"/>
        <xs:element ref="c"/>
    </xs:choice>
</xs:complexType>

但是我不知道如何使用前面的定义来定义 (a|b|c)* 并且不添加像下面这样的子元素

<xs:element name="article">
<xs:complexType name="abc*">
    <xs:sequence>
        <xs:element name="abcelement" type="abc" minOccur="0" maxOccur="unbounded"/>
    </xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name="article>
 <xs:complexType name="abc*">
        <xs:choice minOccur="0" maxOccur="unbounded">
            <xs:element ref="a"/>
            <xs:element ref="b"/>
            <xs:element ref="c"/>
        </xs:choice>
    </xs:complexType>
</xs:element>

谢谢

标签: xmlxsddtd

解决方案


将 abc 定义为一个命名的 xs:group,它是 a|b|c 的选择,然后您可以在一个复杂类型中直接引用这个命名组 (a),以及 (b) 在另一个允许重复的复杂类型中引用这个命名组

<xs:group name="abc">
    <xs:choice>
        <xs:element ref="a"/>
        <xs:element ref="b"/>
        <xs:element ref="c"/>
    </xs:choice>
</xs:group>

<xs:complexType name="abc">
  <xs:group ref="abc"/>
</xs:complexType>

<xs:complexType name="abc-repeated">
  <xs:sequence>
    <xs:group ref="abc" minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
</xs:complexType>

未经测试 - 可能有错别字。


推荐阅读