我遇到了xsd定义问题。请帮助提供解决方案 -
我有两个可能的元素结构 -
<Books>
<Book>Effective java</Book>
</Books>
OR
<Books>
<Book>
<Name>Effective java</Name>
<Author>Josh</Author>
</Book>
</Books>
我尝试使用两种不同的复杂类型来定义每种类型,但验证失败说我们不能拥有多种类型的元素。 此外,我尝试使用union,但看起来它只适用于内置类型。
这一切都可能吗?如果是,请帮助提供指示。
答案 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规范中。