0

我正在尝试为以下文档创建 XML 模式。我想要一个List可以包含TextItems 或Lists 的元素:

<!-- a "List" containing "TextItem"s: -->

<List>
  <TextItem><TextItemData>foo</TextItemData></TextItem>
  <TextItem><TextItemData>bar</TextItemData></TextItem>
</List>


<!-- a "List" containing "List"s of "TextItem"s: -->

<List>

  <List>
    <TextItem><TextItemData>foo1</TextItemData></TextItem>
    <TextItem><TextItemData>bar1</TextItemData></TextItem>
  </List>

  <List>
    <TextItem><TextItemData>foo2</TextItemData></TextItem>
    <TextItem><TextItemData>bar2</TextItemData></TextItem>
  </List>

</List>

以下 XML 模式定义完成了该任务:

<xs:complexType name="TextItemType">
  <xs:sequence>
    <xs:element name="TextItemData" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="ListType">
  <xs:choice>
    <xs:sequence>
      <xs:element name="TextItem"    type="TextItemType"    minOccurs="0"   maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:element name="List"          type="ListType"        minOccurs="0"   maxOccurs="unbounded"/>
  </xs:choice>
</xs:complexType>

我真正想要的是如下列表(没有TextItemData):

<List>
  <TextItem>foo</TextItem>
  <TextItem>bar</TextItem>
</List>

我可以将 of 的定义合并到 ofTextItem的定义中List以摆脱TextItemData. 但是,TextItem由于我在示例中省略了属性,实际上的定义相当复杂。此外,还有其他种类的物品,例如BinaryItems. 的定义List将变得难以理解。

如何消除对TextItemData元素的需求?

4

1 回答 1

1

听起来你实际上想要做的是:

  <xs:complexType name="TextItemType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="FirstAttribute" />
        <xs:attribute name="SecondAttribute" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:element name="TextItem" type="TextItemType" />

但是,如果您只想将 TextItemType 用于那个元素,则无需定义它。你可以这样做:

  <xs:element name="TextItem">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="FirstAttribute" />
          <xs:attribute name="SecondAttribute" />
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
于 2013-08-01T10:06:17.813 回答