Resumen breve: me gustaría saber cómo usar la tecla/keyref de XSD para permitir que los elementos tengan referencias entre ellos. tiene que tener una forma de ejemplo, usando un simple xsd y un XML.XML Schema key/keyref - cómo usarlos?
Relato largo: Estoy familiarizado con el uso de ID/IDREF. Los uso para conectar elementos para JAXB. Me han dicho repetidamente que el constructo clave/keyref en XSD ofrece una mayor flexibilidad para la referencia entre elementos. He consultado el OReilly XML Schema book, que parece enseñar todo sobre la definición correcta de key/keyref y cómo es similar al ID/IDREF (pero mejor) y no da un ejemplo simple de su uso. No parece ser similar, porque define el ID como un atributo en un elemento y el IDREF en otro elemento y voila. Pero clave/keyref tienen que definirse en un ancestro común de la referencia y el elemento de referencia (que yo sepa) ...
utilizo los archivos XSD para generar clases Java con destino a JAXB con XJC
He buscado para how-tos, tutoriales y ejemplos, pero google me da restos. lo mismo para las búsquedas en SO (también con google y búsqueda inclusiva con '+').
Para facilitar la vida de todos, preparé un XSD con un par de llaves/llaveros ya definidos, tal como lo he entendido.
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="referenced">
<xs:complexType>
<xs:attribute name="id" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="owner">
<xs:complexType>
<xs:attribute name="id" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="aKey">
<xs:selector xpath="owner" />
<xs:field xpath="@id" />
</xs:key>
<xs:keyref name="aKeyRef" refer="aKey">
<xs:selector xpath="referenced" />
<xs:field xpath="@id" />
</xs:keyref>
</xs:element>
¿Cómo sería un pedazo de XML parecer, con un 'owner'-elemento de referencia a un' elemento referenced'?
EDIT: aplicó el cambio propuesto por Tom W, cambiando el atributo xpath del elemento clave a "owner". A JAXB (XJC) aún no le importa.
Gracias
aah, es por eso que no hay ningún atributo involucrado. Apliqué el cambio que señaló, pero JAXB no genera nada para poder acceder al elemento al que hace referencia el propietario: toda la parte clave/parte clave no parece tener ningún impacto en el mapeo. ¿Hay algo más que me pierdo? – kostja
quise decir que XJC no genera ... – kostja
Tal vez debería aclarar lo que estoy diciendo en la publicación anterior. No sé lo que es JAXB, pero esto no debería marcar la diferencia, lo que estoy tratando de decir es que decir ... . .es todo lo que necesita para expresar la relación clave, no existe una sintaxis xml para declarar específicamente una relación clave en la instancia. Lo que supongo que quieres decir es que estás usando un marco que se supone que funciona como un ORM para archivos xml, en cuyo caso puedes esperar algún resultado significativo, en cuyo caso, intenta jugar con el alcance de la tecla y keyref por moviéndolos. –