Ограничения идентичности схемы XML - Можно ли использовать абсолютный путь в XPath в селекторе?

Я хочу реализовать ссылочную целостность в XML-документе, используя key & keyref в XML-схеме.

Допустим, мой XML выглядит так:

<root>
  <parents>
     <parent parentID="P01">XXX</parent>
     <parent parentID="P02">XXX</parent>
  </parents>

  <sons>
     <son sonID="S01" parentID="P01">XXX</son>
     <son sonID="S02" parentID="P02">XXX</son>
     <son sonID="S03" parentID="P02">XXX</son>
  </sons>
</root>

Например, в моем XML- файле я хочу определить атрибут parentID в качестве первичного ключа для родительского элемента.

Я объявляю соответствующий ключ xs: внутри корневого элемента:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

<xs:element name="root" type="myRootType" >
  <xs:key name="parentKey">
    <xs:selector xpath="./parents/parent" />
    <xs:field xpath="@parentID"/>
  </xs:key>  
</xs:element>

<xs:complexType name="myRootType">
   <xs:sequence>
   ....

Он работает нормально (проверка дает ошибку, если два родителя имеют одинаковый идентификатор), используя относительный путь ("./parents/parent) в атрибуте xpath элемента xs:selector, как в примере, показанном выше.

Но ограничение идентичности не работает, если я вместо этого использую абсолютный путь ("/root/parent /parent").

Почему это? я понимаю, что он должен работать в обоих направлениях (используя абсолютные или относительные пути в выражении XPath.

1 ответ

Решение

На самом деле XML-схема не поддерживает выражения XPath в <xs:selector>, но подмножество, которое не включает выражения, начинающиеся с /, Это формально описано здесь.

Кроме того, не работает, ваш процессор должен был выдать сообщение об ошибке, так как /root/parents/parent является недопустимым выражением

Другие вопросы по тегам