Как определить Xpath-селектор в XML-схеме для рекурсивного типа - PullRequest
4 голосов
/ 19 октября 2010

Редактировать: добавлены ключи.

Привет,

У меня есть XML-схема следующих типов:

<xs:complexType name="definition">
  <xs:sequence/>
  <xs:attribute name="id"/>
</xs:complexType>

<xsd:key name="definitionId">
  <xsd:selector xpath="definition"/>
  <xsd:field xpath="@id"/>
</xsd:key>

<xs:complexType name="elem">
  <xs:sequence>
    <xs:element name="entry1" type="elem" minOccurs="0" maxOccurs="unbounded"/>
    <xs:element name="entry2" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
  <xs:attribute name="ref" type="xs:string" use="required"/>
</xs:complexType>

Это позволяет что-то вроде:

<definition id="A">
<definition id="B">
<definition id="C">

<entry1 ref="A">
  <entry1 ref="B">
    <entry1 ref="C"/>
    <entry2/>
  </entry1>
  <entry1 ref="C">
  </entry1>
</entry1>

Мне нужнаXPath-селектор, чтобы объявить keyref к атрибуту ref, но я понятия не имею, как определить рекурсивный путь.

<xsd:keyref name="definitionRef" refer="definitionId">
  <xsd:selector xpath="???"/>  <<<how to find all "ref" of entry1 ?    
  <xsd:field xpath="@ref"/>
</xsd:keyref>

Спасибо за ваше время.

1 Ответ

12 голосов
/ 27 октября 2010

<xsd:selector> поддерживает ограниченные выражения XPath. Допускается только ось child, но выражение XPath может начинаться с .//, поэтому вы можете использовать рекурсивное выражение .//entry1

Для получения более подробной информации см. Спецификацию: http://www.w3.org/TR/xmlschema-1/#c-selector-xpath

Элемент <xsd:selector> содержит выражение XML Path Language (XPath), определяющее набор элементов, для которых значения, указанные в поле, должны быть уникальными, поэтому он не должен ссылаться на атрибут ref. Элемент (ы) <xsd:field> относится к значениям, которые должны быть уникальными в этом наборе, поэтому он должен ссылаться на атрибут ref (а остальные fields - на другие значения, если вам нужна уникальная комбинация значений) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...