如何在XML模式中指定键和相关keyref的作用域?
这就是我的情况:我(在根元素中)得到了许多如何在XML模式中指定键和相关keyref的作用域?,xml,xpath,xsd,Xml,Xpath,Xsd,这就是我的情况:我(在根元素中)得到了许多nffg子元素,每个子元素由节点和链接元素组成(minOccurs和maxOccurs都等于1)nodes是一系列node元素(+),每个元素都包含一个nodeName元素,我希望它是键链接是一系列链接(*),每个链接包含源节点和目的节点元素 我已经尝试了很多XPath的可能性,但是我无法达到我想要的。我试图将nodeName作为键,并sourceNode和destNode引用其中一个nodeName,但仅针对同一nffg中的node XML示例:
nffg
子元素,每个子元素由节点
和链接
元素组成(minOccurs和maxOccurs都等于1)nodes
是一系列node
元素(+),每个元素都包含一个nodeName
元素,我希望它是键<代码>链接是一系列链接
(*),每个链接包含源节点
和目的节点
元素
我已经尝试了很多XPath的可能性,但是我无法达到我想要的。我试图将nodeName
作为键,并sourceNode
和destNode
引用其中一个nodeName
,但仅针对同一nffg
中的node
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>
节点1
节点3
节点4
节点1
节点2
节点2
节点1
节点2
XML模式片段(这些约束在根元素中定义):
目前,这对于我的xsd是有效的,但我想让它无效,因为正如您所注意到的,nffg1中有一个
链接,使用as destNodenode2
,它是在nffg2中定义的(因此,我想为链接
)创建一个nffg范围,让我们排除在不同级别定义key和keyref的可能性。这是允许的,但这让人难以置信,我从来没有看到有必要这样做(或者在脑海中形成了一幅有用的关于它如何工作的画面)
如果我们排除这种可能性,那么有两件事你想说:
(1) 在X中,每个Y都有一个唯一的Z值
(2) 在X中,每个R都有一个S值,对应于同一X中存在的Z值之一
为了实现(1),在X的元素声明中定义一个名为N的键,选择器是从X选择Y的路径,字段是从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约束
key name="N"
selector = nodes/node
field = nodeName
keyRef refer="N"
selector = links/link
field = sourceNode
keyRef refer="N"
selector = links/link
field = destNode