相关疑难解决方法(0)

XSD key/keyref:分层键结构

我正在尝试使用xs:key和xs:keyref定义在XML模式上定义一些外键约束.我希望文档的结构按以下方式分层:

<?xml version="1.0" encoding="UTF-8"?>
<tns:root xmlns:tns="http://www.example.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/ SampleSchema.xsd ">
  <parent parentKey="parent1">
    <child childKey="child1"/>
    <child childKey="child2"/>
  </parent>
  <parent parentKey="parent2">
    <child childKey="child1"/>
    <child childKey="child2"/>
  </parent>
  <referrer parentRef="parent1" childRef="child2"/>
</tns:root>
Run Code Online (Sandbox Code Playgroud)

每个父节点都有一个(全局)唯一键,由parentKey定义.每个子项都有由childKey定义的键,但是childKey仅在其包含父项的范围内是唯一的.

然后是一个引用者列表,其中包含对特定父和子的外键引用.

我可以根据需要定义键,只需将它们放在正确的元素上:根元素上的parentKey约束和父元素上的childKey约束.我也可以毫无困难地将keyref定义为parentKey.

尝试为childKey定义keyref时出现问题.我尝试在root元素上定义一个简单的keyref到childKey,但是这不起作用,因为我看不到只选择正确父子树下的子元素.(Eclipse验证器,至少,总是简单地验证文档中最后一个父子树的内容......).

然后我尝试定义一个复合键(在root上),用:

  • selector = parent
  • field = @parentKey
  • field = child/@ childKey

如果父项下定义了多个子项,则会失败.这是基于XSD 1.1规范 3.11.4节第3项的正确行为,该规则指出密钥必须与每个字段定义最多匹配一个节点.

重申一下:如果我强迫childKeys全球独一无二,这很容易实现; 困难在于引用本地唯一的childKeys.

任何XSD大师都有想法吗?

作为参考,这是一个示例XSD,注释掉了一个失败的childKey keyref:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/" xmlns:tns="http://www.example.org/" elementFormDefault="unqualified">

    <element name="root">
        <complexType>
            <sequence>
                <element name="parent" maxOccurs="unbounded" minOccurs="1">
                    <complexType>
                        <sequence>
                            <element name="child" maxOccurs="unbounded" minOccurs="1"> …
Run Code Online (Sandbox Code Playgroud)

xml schema xsd

14
推荐指数
1
解决办法
7890
查看次数

标签 统计

schema ×1

xml ×1

xsd ×1