2011-11-15 21 views
8

Supongamos que tenemos el siguiente esquema:Restringir referencias de identificación a un grupo determinado elemento

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="a_elements"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="a_element" maxOccurs="unbounded"> 
          <xs:complexType> 
           <xs:attribute name="id" type="xs:ID" use="required"/> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="b_elements"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="b_element" maxOccurs="unbounded"> 
          <xs:complexType> 
           <xs:attribute name="id" type="xs:ID" use="required"/> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="c_elements"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="c_element" maxOccurs="unbounded"> 
          <xs:complexType> 
           <xs:attribute name="id" type="xs:ID" use="required"/> 
           <xs:attribute name="ref" type="xs:IDREF" use="required"/> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

y aquí está el archivo XML de ejemplo:

<root> 
    <a_elements> 
     <a_element id="id1"/> 
     <a_element id="id2"/> 
    </a_elements> 
    <b_elements> 
     <b_element id="id3"/> 
     <b_element id="id4"/> 
    </b_elements> 
    <c_elements> 
     <c_element id="id5" ref="id1"/> 
     <c_element id="id6" ref="id2"/> 
    </c_elements> 
</root> 

Para que c_elements pueden hacer referencia a a_elements y b_elements por id. ¿Es posible restringir de algún modo el atributo ref para que solo acepte referencias a elementos de un grupo, digamos a_elementos?

Respuesta

6

En relación con mi respuesta anterior, en teoría no se puede restringir el uso puramente ID/IDREF sin embargo, es posible añadir una restricción de identidad que cumplen sus requisitos:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 

    <xs:complexType> 

     <xs:sequence> 
     <xs:element name="a_elements"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="a_element" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:attribute name="id" type="xs:ID" use="required"/> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="b_elements"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="b_element" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:attribute name="id" type="xs:ID" use="required"/> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="c_elements"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="c_element" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:attribute name="id" type="xs:ID" use="required"/> 
        <xs:attribute name="ref" type="xs:IDREF" use="required"/> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:keyref name="theKeyRef" refer="theKey"> 
     <xs:selector xpath="c_elements/*"/> 
     <xs:field xpath="@ref"/> 
    </xs:keyref> 
    <xs:key name="theKey"> 
     <xs:selector xpath="a_elements/*"/> 
     <xs:field xpath="@id"/> 
    </xs:key> 
    </xs:element> 
</xs:schema> 
+0

Esto parece ser lo que estaba buscando. ¡Gracias! – Max

1

No conozco ningún mecanismo para hacer esto usando ID e IDREF. Por ID de diseño e IDREF, consulte todas las etiquetas en el documento.

Dicho esto, podría solucionar esto de alguna manera, tal vez con reglas de validación en cualquier proceso de la estructura de datos. Sería bastante fácil hacer esto usando expresiones Xpath por ejemplo. Sin duda, puedes lograr esto usando una afirmación de Schematron. Hay un ejemplo de esto aquí: http://zvon.org/xxl/SchematronTutorial/Examples/Example16/example.html

Espero que esto ayude.

Ken

0

solución dada por kennethmay puede no funcionar si está usando XSD 1.0. Por ejemplo, estoy usando el editor visual studio 2015 y señalando para decir que el elemento de b (por ejemplo) no está identificado como un error. Supongo que esto solo funciona para XSD versión 1.1

Cuestiones relacionadas