Solución:
Deberías volver a usar type="xsd:ID"
. Lo que esto hace además de asegurarse de que el valor sea único es que también le permitirá usar xsd:IDREF
para referenciar.
El error que recibe cuando intenta usar xsd:ID
es que un valor de ID debe comenzar con una letra. Si cambia su ID a algo como “ID-1” https://foroayuda.es/ “ID-2” o “a1” https://foroayuda.es/ “a2”, funcionará bien.
Esquema de ejemplo:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:element name="doc">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="unbounded" ref="a"/>
<xsd:element maxOccurs="unbounded" ref="b"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="a">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="id" use="required" type="xsd:ID"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="b">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="idref" use="required" type="xsd:IDREF"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XML de ejemplo:
<doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Untitled1.xsd">
<a id="ID-1">
...........
</a>
<a id="ID-2">
............
</a>
<b idref="ID-1"/>
</doc>
“1” es una cadena válida, por lo que la validación no devuelve un error. Si desea especificar alguna restricción (por ejemplo, “la identificación debe comenzar con una letra”), debe declarar su tipo y especificar el patrón:
<xsd:simpleType name="myID">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[a-zA-Z].*"/>
</xsd:restriction>
</xsd:simpleType>
....
<xsd:attribute name="id" type="myID"/>
....
Si desea especificar la restricción de unicidad, puede usar el elemento xsd: unique como este:
<xsd:element name="root" type="myList">
<xsd:unique name="myId">
<xsd:selector xpath="./a"/>
<xsd:field xpath="@id"/>
</xsd:unique>
</xsd:element>
Esto significará que el elemento “root” declarado como “myList” debe contener subelementos “a” con atributos únicos “id”