XML Schema key/keyref - 如何使用它们?

标签 xml xsd reference schema jaxb

长话短说:我想知道如何使用 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/

相关文章:

xml - XPath 查询通过某种实现来选择元素

java - 将 jboss.xml 迁移到 jboss-ejb3.xml

java - Android 中的 XML 架构验证 - 获取 "java.lang.ExceptionInInitializerError"

xml - 带有导入和 namespace 的 XSD

C++ 函数指针和地址

xml - 将非结构化文档解析为 XML

javascript - 如何使用 JQuery 获取 HTML 表单数据并写入 XML?

xml - 在 XSD 中添加与 XML 文件无关的属性/标签

javascript - 获取实例化构造函数的调用对象?

PHP 类 : referenced variable in one method affects non-referenced variable in other method