xml – XSD key / keyref:层次结构

前端之家收集整理的这篇文章主要介绍了xml – 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>

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

然后是具有引用的列表,其具有对特定父和子的外键引用.

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

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

然后我尝试定义一个复合键(在根目录下),其中:

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

如果父母下有多个子节点定义,则会失败.这是基于XSD 1.1 spec第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">
                                <complexType>
                                    <attribute name="childKey" type="string" use="required"/>
                                </complexType>
                            </element>
                        </sequence>
                        <attribute name="parentKey" type="string" use="required"/>
                    </complexType>
                    <key name="childKeyDef">
                        <selector xpath="child"/>
                        <field xpath="@childKey"/>
                    </key>
                </element>
                <element name="referrer" maxOccurs="unbounded" minOccurs="1">
                    <complexType>
                        <attribute name="parentRef" type="string"/>
                        <attribute name="childRef" type="string"/>
                    </complexType>
                </element>
            </sequence>
        </complexType>
        <key name="parentKeyDef">
            <selector xpath="parent"/>
            <field xpath="@parentKey"/>
        </key>
        <keyref name="parentKeyRef" refer="tns:parentKeyDef">
            <selector xpath="referrers"/>
            <field xpath="@parentRef"/>
        </keyref>
<!--        <keyref name="childKeyRef" refer="tns:childKeyDef">-->
<!--            <selector xpath="referrers"/>-->
<!--            <field xpath="@childRef"/>-->
<!--        </keyref>-->
    </element>
</schema>
如何引用孩子的父母?即使很多孩子,只有一个父母,并且(父,子)组合创建一个全局唯一的密钥,即使子密钥在其父对象中是唯一的:
<key name="childKeyDef">
    <selector xpath="child"/>
    <field xpath="@childKey"/>
    <field xpath="../@parentKey"/>
  </key>

这在xmllint中不起作用,即使规范似乎没有明确禁止这一点,只适用于选择器:3.11.4,(2)说选择器不能是祖先(它只能是上下文节点或后人.)

啊,这是棺材里的钉子(看具体的语法):允许的XPath表达式是非常有限的,根本不包括“..”http://www.w3.org/TR/xmlschema-1/#c-fields-xpaths

所以,对不起,这不能回答你的问题,但也许会给你一些想法.

猜你在找的XML相关文章