这是我的情况:我(在根元素内)有许多nffg
子元素,每个子元素由nodes
和links
元素组成(minOccurs和maxOccurs都等于1) 。 nodes
是一系列node
元素(+),每个元素都包含nodeName
元素,我希望它是关键字。 links
是一系列link
(*),每个都包含sourceNode
和destNode
元素。
我尝试了很多XPath的可能性,但是我无法达到我想要的效果。我正在尝试将nodeName
作为密钥,sourceNode
和destNode
引用其中一个nodeName
,但仅针对同一node
nffg
}}
XML示例:
<nffg nffgName="nffg1" deployTime="1999-11-12T21:00:12">
<nodes>
<node functionalType="func1">
<nodeName>node1</nodeName>
</node>
<node functionalType="func2">
<nodeName>node3</nodeName>
</node>
<node functionalType="func2">
<nodeName>node4</nodeName>
</node>
</nodes>
<links>
<link>
<sourceNode>node1</sourceNode>
<destNode>node2</destNode>
</link>
</links>
</nffg>
<nffg nffgName="nffg2" deployTime="1999-11-12T22:00:12">
<nodes>
<node functionalType="func2">
<nodeName>node2</nodeName>
</node>
</nodes>
<links>
<link>
<sourceNode>node1</sourceNode>
<destNode>node2</destNode>
</link>
</links>
</nffg>
XML模式的片段(这些约束在根元素内定义):
<xsd:key name="nodeNameKey">
<xsd:selector xpath="nffg/nodes/node"></xsd:selector>
<xsd:field xpath="nodeName"></xsd:field>
</xsd:key>
<xsd:keyref name="linkSourceNode" refer="nodeNameKey">
<xsd:selector xpath="nffg/links/link"></xsd:selector>
<xsd:field xpath="sourceNode"></xsd:field>
</xsd:keyref>
<xsd:keyref name="linkDestNode" refer="nodeNameKey">
<xsd:selector xpath="nffg/links/link"></xsd:selector>
<xsd:field xpath="destNode"></xsd:field>
</xsd:keyref>
目前,这对我的xsd有效,但我想使其无效,因为您可以注意到,nffg1中有一个link
用作destNode node2
,在nffg2中定义(所以,我想为link
创建一个nffg-scope。)
答案 0 :(得分:2)
首先,让我们排除在不同级别定义key和keyref的可能性。这是允许的,但这是令人难以置信的,我从来没有看到它的需要(或形成一个有用的心理图片,它是如何工作的。)
如果我们排除这种可能性,那么你想说两件事:
(1)在X中,每个Y都有一个Z
的唯一值(2)在X中,每个R都有一个S值,它对应于同一个X中存在的Z值之一。
要实现(1),在X的元素声明中定义一个名为N的键,其中selector是从X中选择Y的路径,而field是从Y中选择Z的路径。
要实现(2),在X的元素声明中定义一个keyref, 将N命名为其目标键,选择器是从X中选择R的路径,而字段是从R中选择S的路径。
所以在你的情况下:
在nffg
的元素声明中,定义
key name="N"
selector = nodes/node
field = nodeName
keyRef refer="N"
selector = links/link
field = sourceNode
keyRef refer="N"
selector = links/link
field = destNode
就标题问题而言,关键是如果你希望事物在nffg
内是唯一的,你可以在nffg
的元素声明中定义key和keyref约束。