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

在XSD中定义具有相同名称的简单和复杂文本类型,xsd,Xsd,我遇到了xsd定义问题。请帮助提供解决方案- 我有两个可能的元素结构- <Books> <Book>Effective java</Book> </Books> 有效java 或 有效java 乔希 我尝试使用两种不同的复杂类型来定义每种类型,但验证失败,因为我们不能让元素具有多个类型。 此外,我尝试使用union,但看起来它只能在内置类型上工作 这有可能吗?如果是,请帮助提供指针。我认为您的图书模式是由简单文本节点和由姓名和作者组成的

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

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

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

有效java


有效java
乔希
我尝试使用两种不同的复杂类型来定义每种类型,但验证失败,因为我们不能让元素具有多个类型。 此外,我尝试使用union,但看起来它只能在内置类型上工作


这有可能吗?如果是,请帮助提供指针。

我认为您的图书模式是由简单文本节点和由姓名和作者组成的类型组成的。查看W3C的XSD规范。

我想说,由于模式的“唯一粒子属性”和“元素声明一致性”约束,这是不可能的。实际上,这意味着在同一个上下文中,不能有两个具有相同名称和不同类型的元素。允许这样做会使模式不确定,这就是为什么一个普通的
不能工作的原因。我想到的所有解决办法都有副作用

可能的解决办法 1) 重命名元素。例如,将纯文本图书元素定义为
。然后您可以为它们定义不同的类型,并将它们放在
中。问题当然是重命名

2) 使子元素可选,并允许
具有混合内容。这样,您可以同时拥有纯文本或纯元素内容。问题是,当子元素存在时,文本内容也将被允许,并且该文本可以出现在子元素之前、之间和之后

3) 在实例文档中声明使用的类型。这可以通过
xsi:type=“…”
属性完成。问题在于,您需要在实例文档中特别提到所使用的类型(使用该额外属性)。在模式中,这通常是通过创建一个抽象类型来完成的,引用的类型是通过该类型的限制派生的。在您的情况下,唯一适合
的超集类型可能是
xs:anyType
,因为混合类型不能从未混合的类型派生


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

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

    <?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>

可以从不同的元素名称中选择一个,而不是从不同的类型中选择。在两个名称相同但类型不同的元素之间进行选择是不可能的,因为它需要验证器查看当前上下文。谢谢jasso,我认为我最终使用的解决方案是(2)在您的解决方案中。
    <?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>