标识约束
标识约束(IDC)可以在全局或局部元素声明中定义。它们定义了节点的唯一性,并使唯一节点之间能够正确引用。
声明机制
以下机制可用于定义IDC(unique, key, keyref):
•在Schema概览中,可以在全局元素上声明IDC。为此,请选择一个全局元素,然后在特性/断言/标识约束(AAIDC)窗格的“标识约束”选项卡(参见下方截图)中定义IDC。
使用“标识约束”选项卡的插入或追加图标可添加一个IDC(unique, key, keyref)。这些图标还可用于向选定的IDC添加field。使用删除图标可删除选定的field或IDC。
•在全局元素的内容模型视图中,可以为全局元素或局部后代元素定义IDC。在此视图中,可以在“标识约束”选项卡(参见上方截图)或图表中元素的约束框中编辑IDC(参见下方截图,其中match元素具有一个唯一性约束,该约束有team 选择器)。后者可以在“Schema显示配置”对话框(Schema设计 | 配置视图)中选择。或者,您可以单击“Schema设计”工具栏中的在图表中显示约束图标。在图表中,您可以看到IDC的图形表示,可以通过拖放进行编辑。
要在IDC的图表模式启用时在图表中添加IDC(unique, key, keyref),请右键单击要约束的元素并从上下文菜单中选择添加子级 | [ IDC ]。只有在图表中选择IDC时,才能在上下文菜单中启用field项。按Delete键可删除选定的field或IDC。
要在selector和field框中输入XPath表达式,请使用以下方式之一:(i) 通过键入;(ii) 通过从单击selector或field框时自动出现的下拉列表中选择所需的节点;或(iii) 通过将目标节点拖入selector或field框中,然后在该框突出显示时将其放下;XPath表达式将被自动创建。
备注: | 此外,在“组件”输入助手的“标识约束”选项卡中,您还可以看到Schema中所有标识约束的概览。 |
标识约束图标
在图表中显示约束:在内容模型视图中启用。在图表(已打开)和“标识约束”选项卡之间切换显示标识约束。 | |
可视化标识约束:在内容模型视图中启用。显示或隐藏标识约束的信息。 | |
Selector节点, Field节点:位于图表中的节点框,这两个图标分别标识selector和field的XPath表达式(在IDC中)选择的节点。 |
可视化标识约束
启用“可视化标识约束”图标后,IDC信息将显示在图表中。启用可视化后,selector和fieldXPath表达式选择的节点在其框中用图标表示(参见上方图标部分),IDC框与其选择器和字段框用绿线连接(参见上方截图)。
可视化标识约束图标还启用了Schema视图中的IDC验证功能。如果XPath表达式有错误或IDC不正确,则会用红色文本指示错误,橙色文本指示警告。在验证XML Schema文档时,错误或警告消息将显示在“消息”窗口中。
您还可以通过关闭“可视化标识约束”图标来禁用验证。
XML代码片段
本部分后面的IDC示例基于以下有效的实例文档。
<results xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Scores.xsd">
<!----- Groups ----->
<group id="A">
<team name="Brazil"/>
<team name="Germany"/>
<team name="Italy"/>
<team name="Holland"/>
</group>
<group id="B">
<team name="Argentina"/>
<team name="France"/>
<team name="England"/>
<team name="Spain"/>
</group>
<!----- Matches ----->
<match group="A" date="2012-06-12" location="Munich">
<team name="Brazil" for="2" points="3"/>
<team name="Germany" for="1" points="0"/>
</match>
<match group="A" date="2012-06-12" location="Frankfurt">
<team name="Italy" for="2" points="1"/>
<team name="Holland" for="2" points="1"/>
</match>
<match group="B" date="2012-06-13" location="Munich">
<team name="Argentina" for="2" points="3"/>
<team name="France" for="0" points="0"/>
</match>
<match group="B" date="2012-06-13" location="Berlin">
<team name="England" for="0" points="1"/>
<team name="Spain" for="0" points="1"/>
</match>
</results>
唯一性约束(unique)
唯一性约束指定元素或特性(或一组元素和/或特性)的值在定义的范围内必须是唯一的。在上方显示的XML片段中,我们希望确保参加比赛的两支球队不是同一支球队。因此,在每个match元素的范围内,我们需要将team/@name节点的值定义为unique。为此,请执行以下操作:
1.在Schema概览中,选择match元素。这样,match元素将是标识约束定义的范围。
2.在“标识约束”选项卡中,单击选项卡左上角的添加或插入图标,然后在弹出的菜单中选择Unique。这将为唯一性约束添加一行(参见下方截图)
3.为该标识约束命名。(在上方截图中,我们将其命名为MatchTeams。)
4.在Selector列中输入一个XPath表达式以选择team元素。请注意,match元素是上下文节点。team元素现在将是IDC的选择器,即应用唯一性约束的节点。
5.在Field列中,输入@name节点,该节点必须是唯一的。此节点的值也必须是唯一的。
上方描述的唯一性约束指定了每个match元素范围内的每个team 元素都必须有一个唯一的@name特性值。
您可以使用其他字段检查唯一性。例如,可以为results元素定义一个唯一性约束,以确保所有比赛都具有唯一的日期和地点组合:同一日期同一地点最多只能进行一场比赛。对于每个match元素(选择器),唯一性约束必须在results元素的范围内具有唯一的@date和@location值的组合。
以与上述类似的方式定义results元素上的唯一性约束。选择器是match,字段是@date和@location(参见下方截图)。单击追加图标,然后单击Field以添加第二个字段。
请注意: | “标识约束”选项卡中的Refer列仅对keyref约束启用,不适用于unique或key约束。 |
键约束(key)
键约束指定:(i) 元素或特性(或一组元素和/或特性)的值在定义的范围内必须是唯一的,以及(ii) 这些字段元素和/或特性必须在实例XML文档中存在;因此,不应选择可选元素或特性作为键约束的字段。因此,键约束(在上述第(i)中)与唯一性约束完全相同。但是,它规定了一个额外的约束:它的字段元素/特性必须存在于XML文档中。
下方截图显示了在match元素上定义的键约束,类似于上述的第一个唯一性约束。
此键约束指定每个match元素范围内的每个team元素都必须有一个唯一的@name特性值。另外,它还指定@name特性必须出现在每个match/team元素中。
请注意: | “标识约束”选项卡中的Refer列仅对keyref约束启用,不适用于unique或key约束。 |
键引用(keyref)
键引用将实例文档中的一组值与另一组值进行比较。例如,在我们的XML片段中(参见上方片段),我们可以使用一个键引用来检查比赛球队是否在各自组中列出的球队之中。否则,XML文档将无效。
首先,我们创建一个唯一性约束或键约束。下方截图显示了在results元素上创建的唯一性约束(unique)TeamsInGroups。此约束规定,group的每个team都具有一个唯一的@name特性。
然后,我们创建键引用(keyref),名为TeamCheck,它选择match的team子级并检查其@name特性值是否存在于它引用的TeamsInGroups返回的特性值中(在Refer列中)。
在下方截图中,您可以看到该键引用的图形表示(突出显示为蓝色)以及“详细信息”输入助手(您可以在其中选择被引用的IDC)。选定的IDC的关系用绿色实线表示,而未选定的IDC则用绿色虚线表示。此外,对于每个标识约束,selector和field的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默认命名空间声明不适用于特性。 |
标识约束的ID
可以将ID分配给标识约束、其选择器和/或字段。为此,请选择所需的组件,然后在“详细信息”输入助手的id行中输入ID。
标识约束排序
您可以通过单击“标识约束”选项卡工具栏中的排序图标在选项卡中对IDC进行排序。在弹出的“组件排序”对话框(参见下方截图)中,您可以选择对选定的单个组件及其同级,或多个选定的组件进行排序。您可以使用Shift+单击以选择一个范围,然后使用Ctrl+单击以将其他组件添加到选定范围中。
选择范围后,您可以选择按字母顺序对整个范围进行排序(名称在种类之前)或者按字母顺序对种类进行排序(即:首先是唯一性约束,然后是键约束,再是键引用)。
排序顺序是在Schema的文本中实现的。