Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在XML文件的子级上强制唯一性_Xml_Xpath_Xsd_Key - Fatal编程技术网

在XML文件的子级上强制唯一性

在XML文件的子级上强制唯一性,xml,xpath,xsd,key,Xml,Xpath,Xsd,Key,我试图在xml模式中的子级别上强制唯一性,但在制定xpath表达式以强制唯一性时遇到问题 <root> <level1> <level2> <id></id> <level2> <id></id> <level2> <id></id>

我试图在xml模式中的子级别上强制唯一性,但在制定xpath表达式以强制唯一性时遇到问题

<root>
    <level1>
        <level2>
            <id></id>
        <level2>
            <id></id>
        <level2>
            <id></id>
        <level2>
    </level1>
</root>

本质上,我想做的是确保id在级别1中是唯一的,而不仅仅是级别2

我在密钥定义中尝试了几种不同的xpath表达式,但它要么无法编译,要么验证了明显不正确的XML,这意味着我的密钥定义不正确,或者至少没有执行我希望它执行的操作

<xs:key name="ID">
    <xs:selector xpath="level1"/>
    <xs:field xpath="//ID"/>
</xs:key>


我的理解是选择器设置范围,字段用于标识必须唯一的元素。根据我对Xpath的基本理解,//应该匹配任何ID,无论它在结构中的什么位置,但上述定义无效。

键的
字段只接受Xpath的一个子集,如下所示:

Path::=('.'/')?(步骤“/”)*(步骤“@”名称测试)


看起来不接受
//selector
(这意味着当前文档中的任何地方),但是可以使用
//selector
(意味着当前上下文中的任何地方)。

键的
字段只接受XPath的子集,根据以下条件:

Path::=('.'/')?(步骤“/”)*(步骤“@”名称测试)


似乎不接受
//selector
(这意味着当前文档中的任何地方),但可以使用
//selector
(这意味着当前上下文中的任何地方)。

我尝试了
,这两种方法都是有效的,但它们都验证了id不唯一的xml。@johankr Hmm我不知道,但是我对
key
s不太熟悉。我建议尝试使用完全限定的XPath(
level2/id
),看看它是否能解决问题。我尝试了
,这两种方法都是有效的,但它们都能验证id不唯一的xml。@johankr-Hmm我不知道,但我对
键不太熟悉。我建议尝试使用完全限定的XPath(
level2/id
我猜),看看它是否解决了这个问题。