2010-12-01 17 views
6

que tienen este archivo XML:xsd: único con atributos opcionales

<objects> 
    <object name="ID1" /> 
    <object name="ID2" /> 
    <object name="ID2" color="green" /> 
    <object name="ID3" color="green" /> 
<objects> 

me gustaría validar esto en contra de un esquema XSD, por lo que la combinación entre name y color son únicos en el documento.

El problema es que, si uso:

<xs:unique name="UniqueObjectNameColor"> 
    <xs:selector xpath="./object" /> 
    <xs:field xpath="@name" /> 
    <xs:field xpath="@color" /> 
</xs:unique> 

... la regla ignorará object elementos sin el atributo opcional color. Lo siguiente valida correctamente mientras que no debería.

<object name="ID2" /> 
    <object name="ID2" /> 

¿Me puede decir cómo puedo especificar una regla que aplica única y namecolor combinaciones y, cuando el atributo color no está presente en el elemento object, comprueba el name?

+0

me gustaría saber lo mismo. La respuesta de micfra no acaba de cortarlo. –

+2

Puede romper su esquema, pero ¿establece un valor predeterminado para la ayuda del atributo de color? p.ej.

+0

@MattyK que solucionó este problema por mí. ¡Muchas gracias! – RichardTowers

Respuesta

0

Pregunta anterior, pero vale la pena ser respondida. Puede usar más de una restricción unique por elemento. Esto haría lo que quiere:

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/xsdunique-with-optional-properties" 
    xmlns:tns="http://www.example.org/xsdunique-with-optional-properties" 
    elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <element name="objects"> 
     <complexType> 
      <sequence> 
       <element name="object" maxOccurs="unbounded"> 
        <complexType> 
         <attribute name="name" type="string" /> 
         <attribute name="color" type="string" /> 
        </complexType> 
       </element> 
      </sequence> 
     </complexType> 
     <unique name="UniqueObjectName"> 
      <selector xpath="tns:object" /> 
      <field xpath="@name" /> 
     </unique> 
     <unique name="UniqueObjectNameColor"> 
      <selector xpath="tns:object" /> 
      <field xpath="@name" /> 
      <field xpath="@color" /> 
     </unique> 
    </element> 

</schema> 
+2

Hola micfra, gracias por tu respuesta. Quiero que esto sea válido: '' Con su restricción 'UniqueObjectName' esto no será válido. Solo quería evitar copias exactas: No válido: '' No válido: '' – Vitor

+0

Así que no entendí su pregunta correcta, pero puede ser posible. – micfra

+0

Si tiene la posibilidad de cambiar a XMl Schema 1.1, puede agregar en su definición de "objeto". No estoy familiarizado con esto, así que no puedo ayudarlo más. – micfra

4

Uso use y default con o sin un valor como:

<element name="objects"> 
     <complexType> 
      <sequence> 
       <element name="object" maxOccurs="unbounded"> 
        <complexType> 
         <attribute name="name" type="string" /> 
         <attribute name="color" type="string" use="optional" default="noColor" /> 
        </complexType> 
       </element> 
      </sequence> 
     </complexType> 
     <unique name="UniqueObjectNameColor"> 
      <selector xpath="tns:object" /> 
      <field xpath="@name" /> 
      <field xpath="@color" /> 
     </unique> 
    </element> 

</schema> 
Cuestiones relacionadas