Полагаю, ваша проблема в том, что вы хотите, чтобы тип атрибута элемента bbb
был xsd:IDREF
, а не xsd:ID
. Тогда это будет соответствовать вашему xsd:ID
определению:
<xsd:attribute name="idref" type="xsd:IDREF"></xsd:attribute>
Незначительное исправление, которое нужно добавить, это добавление атрибута maxOccurs="unbounded"
к
...
<xsd:complexType name="myA">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
...
Таким образом, весь XSD может be
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<xsd:element name="root">
<xsd:complexType>
<xsd:all minOccurs="1" maxOccurs="1">
<xsd:element name="A" type="myA"/>
<xsd:element name="BBB" type="myBBB"/>
</xsd:all>
</xsd:complexType>
<xsd:key name="myId">
<xsd:selector xpath="./A/a"/>
<xsd:field xpath="@id"/>
</xsd:key>
<xsd:keyref name="myIdref" refer="myId">
<xsd:selector xpath="./BBB/b/bb/bbb"/>
<xsd:field xpath="@idref"/>
</xsd:keyref>
</xsd:element>
<xsd:complexType name="myA">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="a">
<xsd:complexType>
<xsd:attribute name="id" type="xsd:ID"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="myBBB">
<xsd:sequence minOccurs="1">
<xsd:element name="b">
<xsd:complexType>
<xsd:all>
<xsd:element name="bb">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bbb">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="idref" type="xsd:IDREF"></xsd:attribute>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:all>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Теперь ваш XSD должен проверить ваш XML.
Чтобы сделать эту работу, вам даже не нужен
<xsd:key name="myId">
<xsd:selector xpath="./A/a"/>
<xsd:field xpath="@id"/>
</xsd:key>
<xsd:keyref name="myIdref" refer="myId">
<xsd:selector xpath="./BBB/b/bb/bbb"/>
<xsd:field xpath="@idref"/>
</xsd:keyref>
, потому что эта функциональность подразумевается в код xsd:ID
/ xsd:IDREF
. xs:keyref
более гибкий, но в вашем примере он не нужен.