<?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
所以,对不起,这不能回答你的问题,但也许会给你一些想法.