Я пытаюсь проверить уникальность атрибута во всех элементах, которые существуют в документе XML.
Пример XML:
<exampleXml>
<a id="1"/>
<a id="2">
<b id="1"/>
</a>
</exampleXml>
Моя схема 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>
Здесь проблема заключается в xpath. Я хочу сопоставить каждый элемент под корнем, но селектор xpath выше возвращает:
Element '{http://www.w3.org/2001/XMLSchema}selector', attribute 'xpath': The XPath expression '//' could not be compiled
Я могу изменить xpath на "*", но это будет проверять только атрибут id на элементах, которые являются прямыми потомками корня.
I Я проверяю это с помощью lib_xml в PHP, используя DOMDocument :: schemaValidate ()
. Любая помощь очень ценится.