长话短说:我想知道如何使用 XSD 中的 key/keyref 让元素相互引用。它必须具有示例形式,使用简单的 xsd 和 XML。
长话短说:我熟悉 ID/IDREF 的用法。我使用它们来连接 JAXB 的元素。我一再被告知,XSD 中的 key/keyref 构造为元素间引用提供了增强的灵 active 。我咨询了OReilly XML Schema book ,这似乎教导了有关 key/keyref 的正确定义以及它与 ID/IDREF 的相似之处(但更好)的所有内容,并且没有给出其使用的简单示例。它似乎并不相似,因为您将 ID 定义为一个元素中的属性,而将 IDREF 定义为另一个元素中的属性,瞧。但是 key/keyref 必须在引用和被引用元素 (AFAIK) 的共同祖先中定义...
我使用 XSD 文件通过 XJC 生成绑定(bind) JAXB 的 Java 类
我搜索了操作方法、教程和示例,但谷歌给了我一些碎片。 SO 上的搜索也是如此(也适用于 google 和包含 '+' 的包容性搜索)。
为了让每个人的生活更轻松,我准备了一个 XSD,其中包含我所理解的已经定义的 key / key 引用对。
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="referenced">
<xs:complexType>
<xs:attribute name="id" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="owner">
<xs:complexType>
<xs:attribute name="id" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="aKey">
<xs:selector xpath="owner" />
<xs:field xpath="@id" />
</xs:key>
<xs:keyref name="aKeyRef" refer="aKey">
<xs:selector xpath="referenced" />
<xs:field xpath="@id" />
</xs:keyref>
</xs:element>
如果“所有者”元素引用“引用”元素,一段 XML 会是什么样子?
编辑: 应用了 Tom W 提出的更改,将关键元素的 xpath 属性更改为“所有者”。 JAXB (XJC) 仍然不关心。
谢谢
最佳答案
实例文档中没有特殊语法。只需要 keyref 节点匹配现存的关键节点。验证将告诉您是否满足键约束。
重新编写代码:
我自己才刚刚开始涉足 key ,但我想我发现了你的错误 - aKey
应该如下所示:
<xs:key name="aKey">
<xs:selector xpath="owner" />
<xs:field xpath="@id" />
</xs:key>
此外 - 这是一个问题 - 键约束无法识别默认 namespace 。您必须始终在 selector
xpath 的每个部分前面加上您要查找的元素的命名空间前缀。如果您没有 namespace 前缀 - 很难,您需要添加一个。这是标准的限制。
关于XML Schema key/keyref - 如何使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4491983/