XML проверка схемы в отношении дочерних элементов - PullRequest
0 голосов
/ 30 апреля 2020

Вот мой XML файл. Этот файл должен быть проверен на соответствие следующим условиям

  1. Дочерний -> child1 -> parentData -> элемент name должен присутствовать в parent -> parent * -> name
  2. общая длина (в данном случае 4 + 3 = 7) дочерних элементов конкретного родителя (Parent 2) должна быть равна элементу длины этого элемента
  3. Если часть 4-6 в Parent2 используется child1, ни один другой ребенок не должен использовать ту же часть Parent2 и многие другие ...

Пожалуйста, помогите мне, как мне проверить этот файл XML. Я попытался сгенерировать XSD-файл из Visual Studio и смог реализовать уникальное ограничение для родительских и дочерних имен.

<sample>
    <parent>
      <parent1>
        <name>Parent 1</name>
        <length>10</length>
      </parent1>
      <parent2>
        <name>Parent 2</name>
        <length>7</length>
      </parent2>
      <parent3>
        <name>Parent 3</name>
        <length>20</length>
      </parent3>
    </parent>
    <child>
      <child1>
        <length>3</length>
        <parentData>
          <name>Parent 2</name>
          <start>4</start>
          <stop>6</stop>
        </parentData>
      </child1>
      <child2>
        <length>4</length>
        <parentData>
          <name>Parent 2</name>
          <start>0</start>
          <stop>3</stop>
        </parentData>
      </child2>
    </child>
  </sample>

1 Ответ

1 голос
/ 30 апреля 2020

Первое замечание: действительность элемента в XSD зависит только от рекурсивного содержимого этого элемента, но не от его братьев и сестер, родителей или предков. Это говорит о том, что правило, определяющее ограничения между элементами <parent> и <child> (я буду использовать угловые скобки для имен элементов, чтобы избежать путаницы с именами осей), должно go для элемента <sample>: это элемент, который недопустимо, если ограничение недопустимо.

Также обратите внимание, что использование имен элементов, таких как child1 и child2, не облегчает вашу жизнь. Если два элемента представляют одну и ту же сущность реального мира и имеют одинаковую внутреннюю структуру и правила, присвойте им одинаковое имя.

The child -> child1 -> parentData -> name element should be present in parent -> parent* -> name

Это ключ / keyref, определенный в <sample>. Ключ имеет селектор = parent//name, поле = .; keyref имеет селектор = child//parentData/name, поле = ..

>     The total length (4 + 3 = 7 in this case) of the children of a particular parent (Parent 2) should be equal to the length element of
> that element

Это требует утверждений и, следовательно, XSD 1.1. Опять же, это утверждение определено в <sample>, и оно будет выглядеть примерно так: every $p in parent/* satisfies $p/length = sum(child/*[parentData/name = $p/name]/length).

Если часть 4-6 в Parent2 используется child1, никакой другой потомок не должен использовать это часть Parent2 и многое другое ...

Это намного сложнее, и я не собираюсь пытаться это делать. Снова это утверждение на <sample>. Как подсказка, если вы предполагаете, что start<end уже был проверен, то я думаю, что вы можете express ограничить, чтобы два дочерних элемента $ c1 и $ c2 не перекрывались как ($c1/end < $c2/start or $c2/end < @c1/start). Таким образом, ограничение примет вид every $c1 in XXX, $c2 in XXX satisfies ($c1 is $c2 or $c1/end < $c2/start or $c2/end < @c1/start)

...