问题描述
|
我陷入了xsd定义问题。请帮助提供解决方案-
我有两种可能的元素结构-
<Books>
<Book>Effective java</Book>
</Books>
要么
<Books>
<Book>
<Name>Effective java</Name>
<Author>Josh</Author>
</Book>
</Books>
我尝试使用两种不同的复杂类型来定义每种类型,但是验证失败说我们不能拥有具有多种类型的元素。
另外,我尝试使用并集,但看起来它只能在内置类型上运行。
这是可能吗 ?如果是,请帮助提供指示。
解决方法
我要说的是,由于架构的“唯一粒子属性”和“元素声明一致”约束,因此这是不可能的。实际上,这意味着在相同的上下文中,不能有两个具有相同名称和不同类型的元素。允许这样做将使架构变得不确定,这就是为什么普通的旧,它由简单的文本节点组成,而您的类型则由Name和Author组成。在W3C的XSD规范中查找。
<xs:choice>
无法正常工作的原因。我想到的所有解决方法都有副作用。
可能的解决方法
1)重命名元素。例如,将纯文本的book元素定义为<book-title>
。然后,您可以为它们定义不同的类型,并将它们放入<xs:choice>
中。问题当然是重命名。
2)将子元素设为可选,并允许ѭ5包含混合内容。这样,您既可以具有纯文本内容,也可以具有仅元素内容。问题在于,当存在子元素时,文本内容也将被允许,并且该文本可以出现在子元素之前,之中和之后。
3)在实例文档中声明使用的类型。这可以通过“ 6”属性来完成。问题是您需要在实例文档中特别提到使用的类型(具有该额外属性)。同样在模式中,这通常是通过创建抽象类型来完成的,而引用的类型是通过限制从该类型派生的。在您的情况下,仅适用于<book>
的超集类型可能是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>
, 我认为您的Book模式是一个