在XML文件的子级上强制唯一性
我试图在xml模式中的子级别上强制唯一性,但在制定xpath表达式以强制唯一性时遇到问题在XML文件的子级上强制唯一性,xml,xpath,xsd,key,Xml,Xpath,Xsd,Key,我试图在xml模式中的子级别上强制唯一性,但在制定xpath表达式以强制唯一性时遇到问题 <root> <level1> <level2> <id></id> <level2> <id></id> <level2> <id></id>
<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
我猜),看看它是否解决了这个问题。