Первое замечание: действительность элемента в 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)