Ограничить ссылки на идентификаторы для определенной группы элементов - PullRequest
9 голосов
/ 15 ноября 2011

Предположим, у нас есть следующая схема:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="a_elements">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="a_element" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:attribute name="id" type="xs:ID" use="required"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="b_elements">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="b_element" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:attribute name="id" type="xs:ID" use="required"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="c_elements">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="c_element" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:attribute name="id" type="xs:ID" use="required"/>
                                <xs:attribute name="ref" type="xs:IDREF" use="required"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

и вот пример XML-файла:

<root>
    <a_elements>
        <a_element id="id1"/>
        <a_element id="id2"/>
    </a_elements>
    <b_elements>
        <b_element id="id3"/>
        <b_element id="id4"/>
    </b_elements>
    <c_elements>
        <c_element id="id5" ref="id1"/>
        <c_element id="id6" ref="id2"/>
    </c_elements>
</root>

Так что c_elements может ссылаться на a_elements и b_elements по id. Можно ли как-то ограничить атрибут ref, чтобы он принимал ссылки только на элементы из одной группы, скажем, a_elements?

Ответы [ 3 ]

7 голосов
/ 20 ноября 2011

В дополнение к моему более раннему ответу, теоретически вы не можете ограничивать использование только ID / IDREF, однако можно добавить ограничение идентификации, которое удовлетворяет вашему требованию:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">

    <xs:complexType>

      <xs:sequence>
        <xs:element name="a_elements">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="a_element" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="id" type="xs:ID" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="b_elements">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="b_element" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="id" type="xs:ID" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="c_elements">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="c_element" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="id" type="xs:ID" use="required"/>
                  <xs:attribute name="ref" type="xs:IDREF" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:keyref name="theKeyRef" refer="theKey">
      <xs:selector xpath="c_elements/*"/>
      <xs:field xpath="@ref"/>
    </xs:keyref>
    <xs:key name="theKey">
      <xs:selector xpath="a_elements/*"/>
      <xs:field xpath="@id"/>
    </xs:key>
  </xs:element>
</xs:schema>
1 голос
/ 17 ноября 2011

Я не знаю ни одного механизма, чтобы сделать это, используя ID и IDREF. По дизайну ID и IDREF относятся ко всем тегам в документе.

Тем не менее, вы можете обойти это каким-то образом - возможно, с помощью правил валидации для любых процессов, которые обрабатывают структуру данных. Было бы довольно легко сделать это, например, используя выражения Xpath. Конечно, вы можете достичь этого, используя утверждение Schematron. Вот пример этого здесь: http://zvon.org/xxl/SchematronTutorial/Examples/Example16/example.html

Надеюсь, это поможет.

Ken

0 голосов
/ 16 ноября 2016

Решение, данное kennethmay, может не работать, если вы используете XSD 1.0. Например, я использую редактор Visual Studio 2015 и указываю, например, что элемент b (например) не идентифицирован как ошибка. Я думаю, это работает только для XSD версии 1.1

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