【发布时间】:2015-05-27 08:04:31
【问题描述】:
我正在寻找在 XPath 1.0 中创建键和 keyref 之间的约束的方法。
假设我有一个这样的 XML 文档 -
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="schema.xsd">
<items>
<item id="1"/>
<item id="2"/>
<item id="3"/>
</items>
<group>
<items>
<item ref="2"/>
</items>
</group>
</root>
我需要确保“组”下列出的所有项目都引用根/项目列表中的项目。
对于我的 XSD,我尝试了多种不同的方法,但都没有奏效。
例如,
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="schema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="schema.xsd" elementFormDefault="qualified"
id="schema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="items">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="item">
<xs:complexType>
<xs:attribute name="id"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="group" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="items">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="item">
<xs:complexType>
<xs:attribute name="ref"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:keyref name="itemIdRef" refer="itemId">
<xs:selector xpath="item"/>
<xs:field xpath="@ref"/>
</xs:keyref>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="itemId">
<xs:selector xpath="./root/items/item"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
</xs:schema>
根据验证器的不同,当使用存在的 id 时会抛出“...Has A Keyref which References A Key or Unique That Is Out Of Scope”,或者无论使用何种 id 都不会抛出错误。无论哪种方式,我都没有设法让这个 XSD 在任何验证器中成功验证,所以我用于 key 和 keyref 的选择器一定是错误的。
谁能发现我在这方面出了什么问题?
【问题讨论】:
-
可以在元素项中声明元素键。然后在元素根中定义元素keyref。