2012-03-26 13 views
7

Sto scrivendo un po 'di XML e un XSD come un incarico ... Nel mio XML ho un tag denominato a (non vero nome) e l'attributo chiamato id. Parte del mio XML è la seguente:Come dichiarare un attributo ID in XML

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

Quando ho convalidare utilizzando XSD non dà un errore ....

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

Ho cercato di usare xsd: ID come un tipo di dati di attributo id ma mi ha dato un errore; Non riuscivo a capire quale fosse il problema.

Come posso fare questo?

+0

Quindi non si ottiene un errore se si assegna il XSD, ma si fa se non si assegna uno? – kjosh

risposta

14

si dovrebbe tornare a utilizzando type="xsd:ID". Ciò che fa oltre a far sì che il valore sia unico è che ti permetterà anche di usare xsd:IDREF per referenziare.

L'errore che si ottiene quando si tenta di utilizzare xsd:ID è che un valore ID deve iniziare con una lettera. Se cambi il tuo ID a qualcosa come "ID-1"/"ID-2" o "a1"/"a2", funzionerà correttamente.

Esempio di schema:

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

Esempio 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

Come posso aggiungere del testo al mio xml per specificare che per ogni elemento l'ID di attributo è di tipo xsd: ID? È possibile incorporare questa dichiarazione all'interno del documento stesso? – AndreaBogazzi

+0

[Questo (un po 'datato) articolo] (http://www.xml.com/pub/a/2002/11/20/schemas.html?page=3) discute usando 'key',' keyref', 'unique 'su' ID' e 'IDREF'. Qualche commento su questo? – Jens

1

"1" è una stringa valida, pertanto la convalida non restituisce un errore. Se si desidera specificare alcune restrizioni (ad esempio "id dovrebbe inizia con una lettera"), si deve dichiarare il tipo e specificare il modello:

<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"/> 
.... 

Se si desidera specificare la restrizione unicità, è possibile utilizzare il xsd: unico elemento in questo modo:

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

Ciò significa che elemento "root", ha dichiarato come alcuni "myList" dovrebbe contenere elementi secondari "a" con caratteristiche uniche "id"

+0

quello che voglio è avere un attributo id per ogni elemento e assicurarsi che ogni valore di id sia univoco – Zeemaan

+0

Ho appena aggiunto un commento su xsd: caratteristica unica. Ti aiuterà. –

Problemi correlati