4

我正在为描述文章、论文、书籍等章节的 XML 文件编写模式。高级概念是 a<chapter>可以有任意数量的段落<par>、部分<section>、图像和列表。现在,一个部分也是如此,它也可以有任意数量的段落、图像、列表;小节也可以(尚未实施)。

我当前的架构看起来是这样的:

<xs:complexType name="chapter-type">
  <xs:choice maxOccurs="unbounded">
    <xs:element name="section" type="section-type" />
    <xs:element name="par" type="par-type" />
    <xs:element name="image" type="image-type" />
    <xs:element name="ol" type="list-type" />
    <xs:element name="ul" type="list-type" />
  </xs:choice>
</xs:complexType>
<xs:complexType name="section-type">
  <xs:choice maxOccurs="unbounded">
    <xs:element name="par" type="par-type" />
    <xs:element name="image" type="image-type" />
    <xs:element name="ol" type="list-type" />
    <xs:element name="ul" type="list-type" />
  </xs:choice>
</xs:complexType>
<!-- <subsection> and other content-containing elements will repeat the par, image, ol, ul -->

正如您所看到的,有很多重复,并且对于小节和我想重用章节/节内容的其他地方,它会变得“更糟”。

我可以添加一个新元素,比如说<content>或其他任何东西来包装段落/图像/列表,但这需要我将该元素添加到我的 XML 中。这就是我想避免的。

所以我的问题是:我怎样才能避免在任何地方重复这些元素?

4

1 回答 1

5

使用命名组。

<xs:group name="paragraphs-etc">
  <xs:choice>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="par" type="par-type" />
      <xs:element name="image" type="image-type" />
      <xs:element name="ol" type="list-type" />
      <xs:element name="ul" type="list-type" />
    </xs:choice>
  </xs:choice>
</xs:group>

然后从您的复杂类型中引用组:

<xs:complexType name="chapter-type">
  <xs:choice maxOccurs="unbounded">
    <xs:element name="section" type="section-type" />
    <xs:group ref="paragraphs-etc"/>
  </xs:choice>
</xs:complexType>
<xs:complexType name="section-type">
  <xs:group ref="paragraphs-etc"/>
</xs:complexType>

组引用的重复信息来自组引用,而不是组定义。(因此将paragraphs-etc 组包装在另一个不必要的xs:choice 中——它确保对该组的任何引用都是对一组可重复选择的引用。)

于 2013-07-26T23:41:25.580 回答