2011-07-15 14 views
6

Estoy intentando validar el uniquess de un atributo en todos los elementos que existen en un documento XML.Validación de la exclusividad de atributos con XSD a través del documento XML

Ejemplo XML:

<exampleXml> 
    <a id="1"/> 
    <a id="2"> 
    <b id="1"/> 
    </a> 
</exampleXml> 

Mi esquema XSD:

<xs:schema elementFormDefault="qualified"> 
    <xs:element name="exampleXml"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="unbounded" name="a"> 
      <xs:complexType> 
      <xs:complexContent> 
       <xs:extension base="baseRuleType"> 
       <xs:sequence> 
        <xs:element minOccurs="0" maxOccurs="1" name="b"> 
        <xs:complexType> 
         <xs:complexContent> 
         <xs:extension base="baseRuleType"/> 
         </xs:complexContent> 
        </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
       </xs:extension> 
      </xs:complexContent> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="duplicateIdsForbidden"> 
     <xs:selector xpath="//"/> 
     <xs:field xpath="@id"/> 
    </xs:unique> 
    </xs:element> 
    <xs:complexType name="baseRuleType"> 
    <xs:attribute name="id" use="optional"/> 
    </xs:complexType> 
</xs:schema> 

El XPath es la cuestión aquí. Quiero que coincida con todos los elementos en la raíz pero el XPath selector de rentabilidad por encima:

 
Element '{http://www.w3.org/2001/XMLSchema}selector', attribute 'xpath': 
The XPath expression '//' could not be compiled 

puedo cambiar el XPath para "*", pero que sólo se validar el atributo id en los elementos que son descendientes directos de la raíz.

Estoy validando esto con lib_xml en PHP usando DOMDocument::schemaValidate(). Cualquier ayuda muy apreciada.

+1

¿por qué no establece el tipo de atributo en ID o usa xml: id para el atributo ID? Eso reforzaría la unicidad automáticamente. Los ID no pueden ser numéricos, sino NCNames. – Gordon

+0

'Puedo cambiar el xpath a '*' pero eso solo validará el atributo id en los elementos que son descendientes directos de la raíz.' Creo que te refieres a '... que son directos * niños * del elemento de nivel superior', ¿verdad? – LarsH

Respuesta

8

Utilice <xs:selector xpath=".//*"/>.

+1

Sí. Para explicar esto, '//' es equivalente a '/ descendiente-o-auto :: nodo() /'. Como termina con una barra inclinada, no es una expresión XPath completa. (La excepción es '/' en sí.) – LarsH

+1

@Gordon @LarsH gracias chicos, aprendí un par de cosas que no sabía. –

Cuestiones relacionadas