如何在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 destNode
node2
,它是在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