2012-03-26 24 views
7

Estoy escribiendo un XML y un XSD como una asignación ... En mi XML tengo una etiqueta llamada a (nombre no real) y el atributo llamado id. Parte de mi XML se muestra a continuación:Cómo declarar un ID de atributo en XML

<a id="1"> 
    ........... 
    </a> 
    <a id="1"> 
    ............ 
    </a> 

Cuando validar el uso de XSD no da un error ....

<xsd:attribute name="id" type="xsd:string" /> 

He intentado utilizar xsd: ID como un tipo de datos de atributo id pero me dio un error; No pude entender cuál es el problema.

¿Cómo puedo hacer esto?

+0

Así que usted no recibe un error si se asigna el xsd, pero lo hacen si no se asigna uno? – kjosh

Respuesta

14

Usted debe volver a usando type="xsd:ID". Lo que hace además de asegurarse de que el valor sea único es que también le permitirá usar xsd:IDREF para hacer referencia.

El error que se produce al intentar usar xsd:ID es que un valor de ID debe comenzar con una letra. Si cambia su ID a algo como "ID-1"/"ID-2" o "a1"/"a2", funcionará bien.

Ejemplo de esquema:

<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> 

Ejemplo XML:

<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> 
+0

¿Cómo puedo agregar texto a mi xml para especificar que para cada elemento el ID de atributo sea del tipo xsd: ID? ¿Es posible incrustar esta declaración dentro del documento en sí? – AndreaBogazzi

+0

[Este artículo (algo anticuado)] (http://www.xml.com/pub/a/2002/11/20/schemas.html?page=3) analiza el uso de 'key',' keyref', 'unique 'sobre' ID' y 'IDREF'. ¿Algún comentario sobre eso? – Jens

1

"1" es una cadena válida, por lo que la validación no devuelve un error. Si desea especificar algunas restricciones (por ejemplo, "Identificación deberían empieza con una letra"), usted tiene que 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 singularidad, puede utilizar xsd: único elemento de la siguiente manera:

<xsd:element name="root" type="myList"> 
    <xsd:unique name="myId"> 
    <xsd:selector xpath="./a"/> 
    <xsd:field xpath="@id"/> 
    </xsd:unique> 
</xsd:element> 

esto significa que el elemento "raíz" declarada como algunos "miLista" debe contener subelementos "a" con atributos únicos "id"

+0

Lo que quiero es tener un atributo de identificación para cada elemento y asegurarme de que cada valor de identificación sea único – Zeemaan

+0

Acabo de agregar un comentario sobre xsd: función única. Esto te ayudará. –

Cuestiones relacionadas