Как проверить в XSD значение узла xml по значению соседнего узла xml - PullRequest
3 голосов
/ 05 февраля 2010

Предположим, в XSD определен элемент 'answer':

                <xs:element name="answer" minOccurs="1" maxOccurs="1">
                  <xs:complexType>
                    <xs:attribute name="name" use="required">
                      <xs:simpleType>
                        <xs:restriction base="answer"/>
                      </xs:simpleType>
                    </xs:attribute>
                  </xs:complexType>
                </xs:element>

в том же документе у нас есть элемент 'language', определенный как:

                <xs:element name="language" minOccurs="1" maxOccurs="1">
                  <xs:complexType>
                    <xs:attribute name="name" use="required">
                      <xs:simpleType>
                        <xs:restriction base="answer"/>
                      </xs:simpleType>
                    </xs:attribute>
                  </xs:complexType>
                </xs:element>

У обоих есть запись <xs:restriction base="answer"/> где «ответ» - это перечисление предопределенных значений.

Итак, мне нужно проверить, что если существует узел «answer» с именем = 'some_answer' также существует узел ответа с именем = 'some_answer'

Пример:

<answer name="some_answer"/>
<language name="some_answer"/>

Ответы [ 2 ]

2 голосов
/ 05 февраля 2010

Я не пробовал, но это возможно при использовании элементов key и keyref в схеме XML. Вы должны определить отношения ключ / ключ в обоих направлениях.

Отношение от языка -> ответ определяется следующим образом:

<xs:key name="answerKey">
 <xs:selector xpath="/answer"/>
 <xs:field xpath="@name"/>
</xs:key>

<xs:keyref name="languageRef" refer="answerKey">
 <xs:selector xpath="/language"/>
 <xs:field xpath="@name"/>
</xs:keyref>

И затем вы определяете это и в другом направлении:

<xs:key name="languageKey">
 <xs:selector xpath="/language"/>
 <xs:field xpath="@name"/>
</xs:key>

<xs:keyref name="answerRef" refer="languageKey">
 <xs:selector xpath="/answer"/>
 <xs:field xpath="@name"/>
</xs:keyref>

См. http://www.w3.org/TR/xmlschema-0/#specifyingUniqueness и http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#element-keyref

0 голосов
/ 05 февраля 2010

Вы не можете выполнять такой вид проверки в схеме XML - вы не можете ссылаться на значения других узлов или требовать, чтобы один узел присутствовал, когда есть брат (или отсутствует).

Проверки такого типа могут обрабатываться другими контролерами проверки, такими как Schematron - но обычная схема XML не может этого сделать.

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