Может ли схема XML определять ограничения совместного использования? - PullRequest
2 голосов
/ 15 июля 2009

Может ли в документе схемы XML указываться, что два элемента должны совместно встречаться?

Например, есть два необязательных элемента, и они либо присутствуют, либо оба отсутствуют.

a b? c d? e      # giving only {ace, abcde}
                 # instead of all combinations: {ace, acde, abce, abcde}

<element name="root">
  <complexType>
    <sequence>
      <element ref="a"/>
      <element ref="b" minOccurs="0"/>
      <element ref="c"/>
      <element ref="d" minOccurs="0"/>
      <element ref="e"/>
    <sequence>
  <complexType>
<element>

Другой пример: есть два повторяющихся элемента и что, сколько раз первый встречается, второй также встречается много раз:

a b^n c d^n e  # where ^n is a superscript denoting number of repeats
               # giving {ace, abcde, abbcdde, abbbcddde, ...}
               # but no other combinations

<element name="root">
  <complexType>
    <sequence>
      <element ref="a"/>
      <element ref="b" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="c"/>
      <element ref="d" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="e"/>
    <sequence>
  <complexType>
<element>

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

Ответы [ 2 ]

4 голосов
/ 15 июля 2009

Совместное вхождение - это одна из вещей, которую существующая спецификация схемы 1.0 не может решить. Это одна из причин выпуска Schematron . Валидация, основанная на утверждениях, может справиться с этим случаем, наряду с любым другим, который может быть выражен с помощью XPath express довольно просто.

Кроме того, в схеме 1.1 spec есть функция подтверждения, но я пока не знаю о широко распространенной поддержке процессора для 1.1.

Классический пример, когда проверка на основе утверждений обычно вращается вокруг транзакции по кредитной карте, например:

<card>
  <number>1111-1111-1111</number>
  <type>mastercard</type>
</card>

Здесь мы хотим убедиться, что номера карт Mastercard начинаются с «1», а виза начинается с «2» (конечно, это не настоящая конвенция). Это невозможно сделать с помощью Schema 1.0, но довольно просто с помощью утверждения (в псевдокоде)

<assert test="starts-with(card/type[.='mastercard'],'1')"/>
1 голос
/ 15 июля 2009

Не уверен насчет возможности сделать это напрямую. Однако простой вариант - встроить их в один необязательный элемент, и каждый элемент нового элемента будет обязательным. Что-то вроде:

<element name="root">
  <complexType>
    <sequence>
      <element ref="a"/>
      <element ref="c"/>
      <element ref="f" minOccurs="0">
        <complexType>
          <element ref="b" minOccurs="1"/>
          <element ref="d" minOccurs="1"/>
        </complexType>
      </element>
      <element ref="e"/>
    </sequence>
  </complexType>
</element>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...