Проверка уникальности атрибута с помощью XSD в документе XML - PullRequest
6 голосов
/ 15 июля 2011

Я пытаюсь проверить уникальность атрибута для всех элементов, существующих в документе 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 здесь.Я хочу сопоставить каждый элемент под root, но селектор xpath выше возвращает:

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

Я могу изменить xpath на "*", но это будет проверять только атрибут id для элементов, которые являются прямыми потомкамиroot.

Я проверяю это с помощью lib_xml в PHP, используя DOMDocument::schemaValidate().Любая помощь с благодарностью.

1 Ответ

8 голосов
/ 15 июля 2011

Использование <xs:selector xpath=".//*"/>.

...