2011-10-10 34 views
10

Digamos que tengo siguiente archivo XML:restricción único en el esquema XML

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

y un fragmento de esquema 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> 

Lo que quiero es hacer una restricción que no permitirá que dos idénticos valores del autor, pero el anterior no funciona de esa manera. ¿Qué estoy haciendo mal?

Respuesta

16

El selector XPath selecciona los nodos que deben ser únicos (en ese caso, debe seleccionar los nodos de autor).

El XPath field selecciona lo que "los hace únicos" (en ese caso, usar . hará que su valor tipeado, en ese caso el texto entre las etiquetas, tratado como una cadena, se use).

El documento

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

debe ser válida contra el siguiente esquema:

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

mientras éste no debe:

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

Puede usar type = "xs: ID" en el elemento author. También hay tipo IDREF para referirse a una identificación.

+0

restricciones únicas tienen algunas ventajas sobre 'xs: ID ', ver http://www.xml.com/pub/a/2002/11/20/schemas.html#identity_constraints – DaveFar

Cuestiones relacionadas