2011-10-10 13 views
10

Diciamo che ho seguente file XML:vincolo Unico in XML Schema

<authors> 
    <author>a1</author> 
    <author>a2</author> 
    <lastmodified>2010</lastmodified> 
</authors> 

e un frammento di schema XML:

<xs:element name="authors" maxOccurs="1"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="author" maxOccurs="unbounded" type="xs:string"> </xs:element> 
     <xs:element name="lastmodified" type="xs:date" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="uniqueAuthor"> 
    <xs:selector xpath="."/> 
    <xs:field xpath="author"/> 
    </xs:unique> 
</xs:element> 

Quello che voglio è fare un vincolo che non permetterà a due identici valori dell'autore, ma quello sopra non funziona in questo modo. Che cosa sto facendo di sbagliato?

risposta

16

selector XPath seleziona i nodi che devono essere univoci (in tal caso, deve selezionare i nodi dell'autore).

Il field XPath seleziona ciò che "li rende unici" (in tal caso, utilizzando . causerà il loro valore digitato, in tal caso il testo tra i tag, trattato come una stringa, da utilizzare).

Il documento

<?xml version="1.0" encoding="UTF-8"?> 
<authors> 
    <author>a1</author> 
    <author>a2</author> 
    <lastmodified>2010-01-01</lastmodified> 
</authors> 

dovrebbe essere valido contro il seguente schema:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="authors"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="author" maxOccurs="unbounded" type="xs:string"/> 
     <xs:element name="lastmodified" type="xs:date" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="uniqueAuthor"> 
     <xs:selector xpath="author"/> 
     <xs:field xpath="."/> 
    </xs:unique> 
    </xs:element> 
</xs:schema> 

mentre questo non dovrebbe:

<?xml version="1.0" encoding="UTF-8"?> 
<authors> 
    <author>a1</author> 
    <author>a1</author> 
    <lastmodified>2010-01-01</lastmodified> 
</authors> 
1

È possibile utilizzare type = "xs: ID" sull'elemento autore. C'è anche il tipo IDREF per il riferimento a un ID.

+0

vincoli di unicità hanno alcuni vantaggi rispetto 'xs: ID ', vedere http://www.xml.com/pub/a/2002/11/20/schemas.html#identity_constraints – DaveFar