xsd的key与keyref在msdn,菜鸟教程以及w3cschool中都说的模棱两可。所以先上段代码,看我理解的对不对:
<xs:key name="pNumKey">
<xs:selector xpath="B/part"/>
<xs:field xpath="@key-number"/>
</xs:key>
<xs:keyref name="dummy" refer="pNumKey">
<xs:selector xpath="A"/>
<xs:field xpath="@ref-number"/>
</xs:keyref>
上面这段代码,我的理解是key返回了元素B的part元素的key-number属性的值的
一个集合,然后keyref的限定A元素的ref-number属性的值必须是在这个集合内的。不知道这样理解对不对,如果不对,万望指出!
另外,微软msdn的这个例子验证不过去不知道是怎么回事,麻烦告知。如果有错误,希望帮忙改正,例子来自msdn:https://msdn.microsoft.com/zh-cn/library/ms256101(v=vs.80).aspx
顺便把代码粘贴过来:
首先是xsd文件
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="namespace1"
xmlns:r="namespace1"
elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="A" type="r:A" maxOccurs="unbounded">
<xs:keyref name="dummy" refer="r:pNumKey">
<xs:selector xpath="r:part"/>
<xs:field xpath="@ref-number"/>
</xs:keyref>
</xs:element>
<xs:element name="B" type="r:B"/>
</xs:sequence>
</xs:complexType>
<xs:key name="pNumKey">
<xs:selector xpath="r:B/r:part"/>
<xs:field xpath="@key-number"/>
</xs:key>
</xs:element>
<xs:complexType name="A">
<xs:sequence>
<xs:element name="part" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="ref-number" type="xs:integer"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="B">
<xs:sequence>
<xs:element name="part" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="key-number" type="xs:integer"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
然后是xml文件:
<root xmlns="namespace1">
<A>
<!-- if the ref-number is not equal to one of the key-number, the validation will give error -->
<part ref-number="1"/>
</A>
<A>
<!-- if the ref-number is not equal to one of the key-number, the validation will give error -->
<part ref-number="2"/>
</A>
<B>
<part key-number="1"/>
<part key-number="2"/>
<part key-number="3"/>
</B>
</root>
这段代码中,把定义A元素的那段中的所有的r名称空间去掉倒是可以走通,但是A的part的ref-number即使是100居然都可以。按照我前面的理解,应该只能为1或者2或者3才对。