在XSD中定义具有相同名称的简单和复杂类型

时间:2011-05-27 12:16:13

标签: xsd

我遇到了xsd定义问题。请帮助提供解决方案 -

我有两个可能的元素结构 -

<Books>
 <Book>Effective java</Book>
</Books>

OR

<Books>
 <Book>
    <Name>Effective java</Name>
    <Author>Josh</Author>
 </Book>
</Books>

我尝试使用两种不同的复杂类型来定义每种类型,但验证失败说我们不能拥有多种类型的元素。 此外,我尝试使用union,但看起来它只适用于内置类型。

这一切都可能吗?如果是,请帮助提供指示。

3 个答案:

答案 0 :(得分:1)

我会说,因为模式的“独特粒子归属”和“元素声明一致”约束,所以不可能。实际上,这意味着在相同的上下文中,您不能拥有两个具有相同名称和不同类型的元素。允许这样会使架构不确定,这就是普通旧<xs:choice>不起作用的原因。我想到的所有变通方法都有副作用。

可能的解决方法

1)重命名元素。例如,将纯文本书籍元素定义为<book-title>。然后,您可以为它们定义不同的类型,并将它们放在<xs:choice>内。问题当然是重命名。

2)使子元素可选,并允许<book>具有混合内容。这样,您既可以使用纯文本,也可以只使用元素内容。问题是当子元素存在时,也允许文本内容,并且该文本可以出现在子元素之前,之间和之后。

3)在实例文档中声明使用的类型。这可以使用xsi:type="..."属性来完成。问题是您需要在实例文档中特别提及使用的类型(具有该额外属性)。同样在模式中,这通常通过创建抽象类型来完成,并且引用的类型是通过来自该类型的限制派生的。在您的情况下,只有<book>的合适超集类型可能是xs:anyType,因为混合类型无法从未混合的类型派生。

4)使用一些不需要确定性的结构定义语言。 (RelaxNG可能是合适的,虽然我对它不熟悉。)问题当然是需要学习一门新语言并且可能缺乏软件支持。

答案 1 :(得分:1)

得到了这个允许混合简单和复杂类型的解决方案 -

    <?xml version="1.0" encoding="Windows-1252"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name='Name' type='xs:string'/>
  <xs:element name='Author' type='xs:string'/>
  <xs:element name="Books">
    <xs:complexType>
      <xs:sequence>
        <xs:element name='Book' minOccurs='0'>
          <xs:complexType mixed='true'>
            <xs:all>
              <xs:element ref='Name' minOccurs='0'/>
              <xs:element ref='Author' minOccurs='0'/>
            </xs:all>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

答案 2 :(得分:0)

我认为您的图书架构是&lt; choice&gt;由简单的文本节点和由Name和Author组成的类型组成。查找&lt; choice&gt;在W3C的XSD规范中。