Estoy tratando de definir algunas restricciones de clave externa en un esquema XML utilizando las definiciones xs: key y xs: keyref. Quiero que la estructura del documento para ser jerárquica de la siguiente manera:Tecla XSD/keyref: estructura de clave jerárquica
<?xml version="1.0" encoding="UTF-8"?>
<tns:root xmlns:tns="http://www.example.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/ SampleSchema.xsd ">
<parent parentKey="parent1">
<child childKey="child1"/>
<child childKey="child2"/>
</parent>
<parent parentKey="parent2">
<child childKey="child1"/>
<child childKey="child2"/>
</parent>
<referrer parentRef="parent1" childRef="child2"/>
</tns:root>
A cada padre tiene una clave (a nivel mundial) único, definido por parentKey. Cada elemento secundario tiene la clave definida por childKey, , pero childKey solo es único dentro del alcance de su elemento primario contenedor.
Luego hay una lista de referencias con referencias de claves externas a un padre y un hijo en particular.
Soy capaz de definir las claves como quiero, simplemente poniéndolas en el elemento correcto: la restricción parentKey en el elemento raíz y la restricción childKey en el elemento padre. También puedo definir keyref to parentKey sin dificultad.
Los problemas surgen al tratar de definir un keyref a childKey. Traté de definir un keyref simple en el elemento raíz para childKey, pero eso no funciona, ya que no veo manera de seleccionar solo los elementos secundarios bajo el subárbol padre apropiado. (El validador de Eclipse, al menos, siempre simplemente valida el contenido del último subárbol padre en el documento ...).
Luego trató de definir una clave compuesta (de raíz), con:
- selector = matriz
- campo = @parentKey
- campo = niño/@ childKey
Este falla si hay más de un hijo definido bajo el padre. Ese es el comportamiento correcto basado en XSD 1.1 spec, sección 3.11.4, elemento 3, que establece que la clave tiene que coincidir como máximo con un nodo por definición de campo.
Solo para reiterar: si forzo a childKeys a ser globalmente único, esto es fácil de implementar; la dificultad está en hacer referencia localmente childKeys únicos.
¿Alguno de los maestros de XSD tiene una idea?
Como referencia, aquí hay una muestra de XSD, con un fallido childKey keyref comentada:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/" xmlns:tns="http://www.example.org/" elementFormDefault="unqualified">
<element name="root">
<complexType>
<sequence>
<element name="parent" maxOccurs="unbounded" minOccurs="1">
<complexType>
<sequence>
<element name="child" maxOccurs="unbounded" minOccurs="1">
<complexType>
<attribute name="childKey" type="string" use="required"/>
</complexType>
</element>
</sequence>
<attribute name="parentKey" type="string" use="required"/>
</complexType>
<key name="childKeyDef">
<selector xpath="child"/>
<field xpath="@childKey"/>
</key>
</element>
<element name="referrer" maxOccurs="unbounded" minOccurs="1">
<complexType>
<attribute name="parentRef" type="string"/>
<attribute name="childRef" type="string"/>
</complexType>
</element>
</sequence>
</complexType>
<key name="parentKeyDef">
<selector xpath="parent"/>
<field xpath="@parentKey"/>
</key>
<keyref name="parentKeyRef" refer="tns:parentKeyDef">
<selector xpath="referrers"/>
<field xpath="@parentRef"/>
</keyref>
<!-- <keyref name="childKeyRef" refer="tns:childKeyDef">-->
<!-- <selector xpath="referrers"/>-->
<!-- <field xpath="@childRef"/>-->
<!-- </keyref>-->
</element>
</schema>
Hola Aron, DID a encontrar una solución para este problema? También estoy atrapado con un problema similar. (No puedo cambiar mi xml). – Rahul
Me temo que no, terminamos moviéndonos a un formato no XML para el intercambio de datos, haciendo que la pregunta sea discutible. – Aron