条件类型分配
条件类型分配是XSD 1.1的一项功能,用于根据XML文档的内容确定元素的类型,更具体地说,通过元素的特性值或特性的存在与否。假设XML文档具有以下元素:
<publication kind="magazine">
...
</publication>
在Schema中,publication元素的类型可以被指定为根据其@kind特性值而变化。在Schema中,这可以通过使用alternative元素来实现,这是XSD 1.1中的新元素。指定多种类型,每种都在一个alternative元素中。
在下方截图中,Publication元素声明有三个alternative子元素,其中两个有test特性(@kind eq 'magazine'和@kind eq 'book’)。第三个alternative元素没有test特性,而是有一个xs:error的简单类型分配(此分配在“详细信息”输入助手中完成,图表中未显示)。一旦触发该类型,将返回XML验证错误。
上述的代码片段如下:
<xs:complexType name="PublicationType">
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Date" type="xs:gYear"/>
</xs:sequence>
<xs:attribute name="kind" type="xs:string"/>
</xs:complexType>
<xs:complexType name="MagazineType">
<xs:complexContent>
<xs:restriction base="PublicationType">
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="Date" type="xs:gYear"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:element name="Publication" type="PublicationType">
<xs:alternative test="@kind eq 'magazine'" type="MagazineType"/>
<xs:alternative test="@kind eq 'book'">
<xs:complexType>
<xs:complexContent>
<xs:extension base="PublicationType">
<xs:sequence>
<xs:element name="ISBN" type="xs:string"/>
<xs:element name="Publisher" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:alternative>
<xs:alternative type="xs:error"/>
</xs:element>
请注意以下几点:
•alternative元素中第一个计算结果为true的alternative元素被选中。因此,alternative元素的顺序起着重要的作用。在内容模型视图中,可以通过将alternative元素框拖动至所需顺序来更改排序。
•请注意,Publication元素有一个类型(PublicationType)。如果没有使用任何alternative元素,则此类型将用作默认类型。但是,在上方示例中,如果前面的alternative元素条件都返回false,则将使用类型为xs:error的alternative元素。
•如果未满足alternative元素条件且元素没有默认类型,则为该元素分配anyType类型。在这种情况下,该元素可以有任何格式正确的XML内容。
•alternative元素和简单类型xs:error都是XSD 1.1中的新功能。
内容模型视图编辑
您可以通过元素的上下文菜单(参见上方截图中的内容模型)将替代类型作为子级添加到元素声明中。
可以在“详细信息”输入助手中定义Alternative元素的类型。如果它是复杂类型,则会显示在alternative元素的扩展矩形中,并可以在那里进一步编辑(参见下方截图)。简单类型不会显示在图表中,但可以在“详细信息”输入助手的“简单类型”选项卡中定义。
注意: | 您可以通过“详细信息”输入助手中的xpathDefaultNamespace特性为XPath表达式指定命名空间。有关XPath默认命名空间的更多信息,请参见以下部分。 |
使用xpathDefaultNamespace
在XML Schema文档中声明的默认命名空间就是该XML Schema文档的默认命名空间。它适用于Schema文档中无前缀的元素名称,但不适用于Schema文档中XPath表达式中的无前缀的元素名称。
xpathDefaultNamespace特性(XSD 1.1中的一个新功能)用于指定XPath表达式中无前缀的元素名称所属的命名空间。Xpath默认命名空间的范围在声明它们的XML Schema元素中。xpathDefaultNamespace特性可以出现在以下XML Schema 1.1元素中:
•xs:schema
•xs:assert和xs:assertion
•xs:alternative
•xs:selector和xs:field(在标识约束中)
xs:schema的xpathDefaultNamespace在XSD 1.1模式下的“Schema设置”对话框中((Schema设计 | Schema设置)定义。对于上方列出的其他元素,xpathDefaultNamespace特性是在其各自的“详细信息”输入助手中设置的(参见下方截图中的示例)。
在xs:schema上声明XPath默认命名空间会为整个Schema范围声明XPath默认命名空间。您可以在允许使用xpathDefaultNamespace特性的元素上覆盖此声明(参见上方列表)。
xpathDefaultNamespace特性包含以下三个关键词之一,而不是包含实际的命名空间:
•##targetNamespace:XPath默认命名空间将与Schema的目标命名空间相同
•##defaultNamespace:XPath默认命名空间将与Schema的默认命名空间相同
•##local:没有XPath默认命名空间
如果文档中没有声明XPath默认命名空间,则XPath表达式中的无前缀元素将不在任何命名空间中。
提示: | XPath默认命名空间声明不适用于特性。 |