断言
本部分描述的断言是针对复杂类型的断言。此类断言在xs:assert元素中定义,该元素是在XML Schema version 1.1中引入的,用作复杂类型的有效性约束。(另一种断言是针对简单类型的断言,它在xs:assertion元素中定义,并在简单类型的“方面”输入助手中创建和编辑。这类断言不包括在本部分的内容中。)
备注: | 断言是XSD 1.1中的功能。因此,断言编辑功能仅在XSD 1.1模式下可用。 |
编辑断言的位置
在Schema视图中,可以通过以下界面区域创建和编辑复杂类型断言:
•Schema概览:在特性/断言/标识约束(AAIDC)窗格的“断言”选项卡中(参见下方截图)。要启用“断言”选项卡,请先将XSD模式更改为1.1(可以通过XSD 1.1工具栏图标进行操作)。
•内容模型视图:可以在“断言”选项卡(参见上方截图)或图表(参见下方截图)中编辑断言。这两个编辑选项(选项卡或图表)在一个特定的时间内只能启用一个。您可以通过在Schema设计工具栏中启用/禁用在图表中显示断言图标(参见下文)来在这两个编辑选项之间切换。(要将这两个选项之一设为默认选项,请转至“Schema显示配置”对话框(Schema设计 | 配置视图 | “元素”选项卡)。)在图表中,选择复杂类型或复杂内容元素的“断言”框。然后直接输入或编辑断言的定义,或者在“详细信息”输入助手中执行这些操作。
在图表中显示断言:在内容模型视图中启用。在图表(已打开)和“断言”选项卡之间切换显示断言。 |
断言的范围
用于定义断言约束的XPath表达式必须在定义其复杂类型的范围内。因此,如果访问一个特定节点需要XPath表达式,则必须在该节点的祖先上定义断言。
添加和删除断言
一个复杂类型可以具有多个断言。要使实例文档中的元素有效,每个断言的XPath表达式的计算结果必须为true。要将断言添加到复杂类型,请执行以下操作:
•在Schema概览中:选择复杂类型。然后,在AAIDC窗格的“断言”选项卡(参见上方截图)中,单击选项卡左上角的添加或插入图标。您可以添加多个断言。要删除断言,请将其选中,然后单击选项卡右上角的删除图标。
•在内容模型视图中 (参见上方截图):在复杂类型上右键单击并选择添加子级 | 断言。或者,在复杂类型的图表中的现有断言上右键单击并选择追加 | 断言或插入 | 断言。您可以向复杂类型添加多个断言。要删除断言,请将其选中并按Delete键。
定义断言的XPath表达式
复杂类型的断言的XPath表达式定义要应用于实例文档中复杂类型元素的验证约束。例如,在上方截图中,断言是为复杂类型元素team定义的,并且断言的XPath表达式为:@region="US"。在XML Schema文档中,断言定义如下:
<xs:assert test='@region="US"'/>
断言指定,在实例文档中,team元素必须具有一个region特性,其值为US。否则,该文件将无效。
请注意以下几点:
•XPath表达式必须用XPath 2.0语言编写。
•在XPath表达式中测试的节点必须在断言的范围内(参见上文)。
•如果表达式的计算结果不是布尔值true/false,则返回值将被转换为布尔值。非空序列转换为true,而空序列转换为false。
•如果表达式包含语法错误,则显示为红色。不标记上下文错误。例如,如果XPath表达式测试一个特性并且该特性未在Schema中定义,则不会标记任何错误。
断言的消息
如果在定义断言的同时提供对断言的解释,这是非常有用的,这样在验证XML实例文档时,如果断言没有得到满足,就可以显示一个适当的消息。由于XML Schema规范未对这类消息作出规定,因此XMLSpy允许Altova xml-schema-extensions命名空间https://www.altova.com/zh/xml-schema-extensions(或任何其他命名空间)中的消息与断言的定义一起提供,并用于XML实例文档的验证。例如:
<xs:assert test="count(//MyNode) ge 1" altova:message="There must be at least one MyNode element"/> or
<xs:assertion test="count(//MyNode) ge 1" altova:message="There must be at least one MyNode element"/>
如果断言中指定的限制没有得到满足,则XMLSpy的验证引擎将显示与该断言相关的消息作为提示,同时还显示验证错误消息。验证器将报告assert/@message特性或assertion/@message特性的值,而不考虑message特性所在的命名空间。然而,在Schema视图中,您仅可以编辑Altova xml-schema-extension命名空间中的message特性。要编辑其他命名空间中的message特性,请使用文本视图。
有关详细信息,请参见断言消息。
使用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默认命名空间声明不适用于特性。 |
对于断言中的XPath表达式,您还可以在断言的定义上指定XPath默认命名空间。为此,在特性/断言/标识约束(AAIDC)窗格的“断言”选项卡(参见下方截图)中,从XPathDefaultNS字段的下拉列表中选择所需的关键词。
选定的命名空间将在断言的范围内。