首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在XSD中定义同名的简单和复杂类型

在XSD中定义同名的简单和复杂类型
EN

Stack Overflow用户
提问于 2011-05-27 20:16:13
回答 3查看 1.1K关注 0票数 1

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

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

代码语言:javascript
复制
<Books>
 <Book>Effective java</Book>
</Books>

代码语言:javascript
复制
<Books>
 <Book>
    <Name>Effective java</Name>
    <Author>Josh</Author>
 </Book>
</Books>

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-30 14:43:49

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

代码语言:javascript
复制
    <?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>
票数 1
EN

Stack Overflow用户

发布于 2011-05-28 03:25:59

我想说这是不可能的,因为schema的“唯一粒子属性”和“元素声明一致”约束。实际上,这意味着在同一上下文中,不能有两个名称相同但类型不同的元素。允许这样做会使模式变得不确定,这就是为什么普通的旧<xs:choice>不能工作。所有出现在我脑海中的变通方法都有副作用。

可能的变通方法

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2011-05-27 20:39:38

我认为您的Book模式是由简单的text节点和由Name和Author组成的类型组成的。请查阅W3C的XSD规范。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6152105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档