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.
¿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
'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