我遇到了一个xsd定义问题。请帮助提供解决方案-
我有两种可能的元素结构-
<Books>
<Book>Effective java</Book>
</Books>或
<Books>
<Book>
<Name>Effective java</Name>
<Author>Josh</Author>
</Book>
</Books>我尝试使用两种不同的复杂类型来定义每种类型,但是验证失败,因为我们不能拥有具有多个类型的元素。此外,我尝试使用联合,但看起来它只能在内置类型上工作。
这有可能吗?如果是,请帮助提供指针。
发布于 2011-05-30 14:43:49
我得到了这个解决方案,它允许简单和复杂类型的混合-
<?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>发布于 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可能是合适的,尽管我不熟悉它。)当然,问题是需要学习一门新的语言,而且可能缺乏软件支持。
发布于 2011-05-27 20:39:38
我认为您的Book模式是由简单的text节点和由Name和Author组成的类型组成的。请查阅W3C的XSD规范。
https://stackoverflow.com/questions/6152105
复制相似问题