Я пытаюсь создать XSD и пытаюсь написать определение со следующим требованием:
- Разрешить указанному дочернему элементу появляться любое количество раз (от 0 до неограниченного)
- Разрешить дочерним элементам быть в любом порядке
Я осмотрелся и нашел различные решения вроде этого :
<xs:element name="foo">
<xsl:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="child1" type="xs:int"/>
<xs:element name="child2" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
Но из того, что я понимаю, xs: choice по-прежнему позволяет выбирать только один элемент. Следовательно, установка MaxOccurs на неограниченное значение должно означать только то, что «любой один» из дочерних элементов может появляться несколько раз. Это точно?
Если приведенное выше решение неверно, как я могу достичь того, что я указал выше в моем требовании?
РЕДАКТИРОВАТЬ : Что делать, если требования следующие?
- Элемент child1 child2 может появляться любое количество раз (от 0 до неограниченного)
- Элементы должны быть в любом порядке
- Элементы child3 и child4 должны появиться ровно один раз.
Например, этот xml действителен:
<foo>
<child1> value </child1>
<child1> value </child1>
<child3> value </child3>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>
но это не (пропавший ребенок3)
<foo>
<child1> value </child1>
<child1> value </child1>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>
Альтернативная формулировка вопроса, добавленная в более позднем редактировании, кажется, все еще остается без ответа: как указать, что среди дочерних элементов элемента должен быть один именованный
child3
, один именованныйchild4
и любое число с именемchild1
илиchild2
, без ограничения на порядок в которые появляются у детей.Это легко определяемый регулярный язык, и необходимая вам модель содержимого изоморфна регулярному выражению, определяющему набор строк, в которых каждая цифра 3 и 4 встречается ровно один раз, а цифры 1 и 2 'встречаются любое количество раз. Если не совсем понятно, как это писать, можно подумать, какой тип конечного автомата вы бы построили для распознавания такого языка. У него будет как минимум четыре различных состояния:
Независимо от того, в каком состоянии автомат находится, могут быть прочитаны «1» и «2»; они не меняют состояние машины. В исходном состоянии также принимаются цифры «3» или «4»; в промежуточных состояниях принимается только «4» или «3»; в конечном состоянии ни «3», ни «4» не принимаются. Структуру регулярного выражения легче всего понять, если мы сначала определим регулярное выражение для подмножества нашего языка, в котором встречаются только «3» и «4»:
Чтобы позволить «1» или «2» встречаться любое количество раз в данном месте, мы можем вставить
(1|2)*
(или[12]*
если наш язык регулярных выражений принимает эту нотацию). Вставляя это выражение во все доступные места, мы получаемПреобразовать это в модель контента несложно. Базовая структура эквивалентна регулярному выражению
(34)|(43)
:Вставить ноль или более вариантов
child1
иchild2
просто:Если мы хотим немного минимизировать объем, мы можем определить именованную группу для повторяющихся вариантов
child1
иchild2
:В XSD 1.1
all
были сняты некоторые ограничения на -groups, поэтому эту модель содержимого можно определить более кратко:Но, как видно из примеров, приведенных ранее, эти изменения
all
-группы на самом деле не меняют выразительную силу языка; они только делают определение некоторых языков более лаконичным.источник
Вот что наконец сработало для меня:
источник
Нет. Выбор происходит индивидуально для каждого «повторения»
xs:choice
происходящего по причинеmaxOccurs="unbounded"
. Следовательно, опубликованный вами код верен и действительно будет делать то, что вы хотите, как написано.источник
Вы должны обнаружить, что следующая схема позволяет то, что вы предложили.
Это позволит вам создать такой файл, как:
Что похоже на ваш вопрос.
источник
minOccurs
иmaxOccurs
ограничены до 1 для детейxs:all
.Если ничего из вышеперечисленного не работает, вы, вероятно, работаете над транзакцией EDI, где вам нужно проверить свой результат на соответствие схеме HIPPA или любому другому сложному xsd в этом отношении. Требование состоит в том, что, скажем, имеется 8 сегментов REF, и любой из них должен появляться в любом порядке, а также не все требуются, означает, что вы можете иметь их в следующем порядке: 1-й REF, 3-й REF, 2-й REF, 9-й REF. В ситуации по умолчанию получение EDI не удастся, поскольку сложный тип по умолчанию
Ситуация даже сложна, когда вы вызываете свой элемент по ссылке, а затем этот элемент в исходном месте сам по себе довольно сложен. например:
Решение:
Здесь просто заменить «последовательность» на «все» или использовать «выбор» с комбинациями мин / макс не сработает!
Первым делом замените.
"xs:sequence" with "<xs:all>"
Теперь вам нужно внести некоторые изменения в то место, откуда вы ссылаетесь на элемент, перейдите по ссылке:*** Теперь в приведенном выше сегменте добавьте в конце точку запуска, например, trigger_field = "REF01 _... полное имя .." trigger_value = "38" Сделайте то же самое для других сегментов REF, где значение триггера будет другим, например, "18 "," XX "," YY "и т. Д., Чтобы информация о вашей записи теперь выглядела так:
b:recordinfo structure="delimited" field.........Biztalk/2003" trigger_field="REF01_...complete name.." trigger_value="38">
Это сделает каждый элемент уникальным, поскольку все сегменты REF (пример выше) имеют такую же структуру, как REF01, REF02, REF03. И во время проверки проверка структуры в порядке, но она не позволяет значениям повторяться, потому что пытается найти оставшиеся значения в самом первом REF. Добавление триггеров сделает их все уникальными, и они будут проходить в любом порядке и ситуационных случаях (например, используйте 5 из 9, а не все 9/9).
Надеюсь, это поможет вам, потому что я потратил на это почти 20 часов.
Удачи
источник