W3C在线验证程序认为下面的XML基于模式有效。但是我认为模式的构造方式(特别是使用key/keyref约束)它是无效的。如何将xsd keyref限制在特定元素中?
模式:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://testSchema"
xmlns="http://testSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:complexType name="defFooType">
<xs:attribute name="name" type="xs:ID" use="required"/>
</xs:complexType>
<xs:complexType name="defBarType">
<xs:attribute name="name" type="xs:ID" use="required"/>
</xs:complexType>
<xs:complexType name="useFooType">
<xs:attribute name="use" type="xs:IDREF" use="required"/>
</xs:complexType>
<xs:complexType name="testType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="defFoo" type="defFooType"/>
<xs:element name="defBar" type="defBarType"/>
<xs:element name="useFoo" type="useFooType"/>
</xs:choice>
</xs:complexType>
<xs:element name="test" type="testType">
<xs:key name="FOOKEY">
<xs:selector xpath="./defFoo"/>
<xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="FOOKEYREF" refer="FOOKEY">
<xs:selector xpath="./useFoo"/>
<xs:field xpath="@use"/>
</xs:keyref>
</xs:element>
</xs:schema>
测试XML:
<?xml version="1.0"?>
<test xmlns="http://testSchema">
<defFoo name="foo1"/>
<defBar name="bar1"/>
<useFoo use="bar1"/>
</test>
我试图限制<useFoo>
元素use
属性只指<defFoo>
元素name
属性。我不明白为什么<useFoo use="bar1"/>
不会导致验证失败。我设置了key/keyref是否错误?还有什么我需要添加?