如何在XML模式中指定密钥和相关keyref的范围?

时间:2017-10-31 11:43:21

标签: xml xpath xsd

这是我的情况:我(在根元素内)有许多nffg子元素,每个子元素由nodeslinks元素组成(minOccurs和maxOccurs都等于1) 。 nodes是一系列node元素(+),每个元素都包含nodeName元素,我希望它是关键字。 links是一系列link(*),每个都包含sourceNodedestNode元素。

我尝试了很多XPath的可能性,但是我无法达到我想要的效果。我正在尝试将nodeName作为密钥,sourceNodedestNode引用其中一个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。)

1 个答案:

答案 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约束。