В Relax NG, как я могу определить 2 элемента, по крайней мере, один из которых требуется?
Мне нужно написать схему XML (я использую Relax NG для генерации RNG...), который требует по крайней мере 1 из 2 различных элементов. Таким образом, если элементы "фрукты" и "овощи", приемлемый xml будет содержать фрукты, овощи или оба.
<fruit>apple</fruit>
<vegetable>broccoli</vegetable>
Это то, что я имею до сих пор, но это фрукт или овощ, и если вы не передадите ни одного фрукта ни овощу, то это тоже работает...
& (element Fruit {
xsd:string { .. }
| (element Vegatable {
xsd:string { .. }
})?
Обновление Ответ кажется правильным, но я не могу понять, как интегрировать это. Когда вы говорите, что я не могу использовать чередование, вы имеете в виду, что я могу сделать что-то подобное?
<meal>
<drink>Water</drink>
<meat>Chicken</meat>
<fruit>Apple</fruit>
<vegetable>Broccoli</vegetable>
</meal>
Где фрукт или овощ или оба требуются?
Обновление 2: это выглядит правильно?
fruit = element fruit { xsd:string }
vegetable = element vegetable { xsd:string }
start =
element Meal {
element Drink { xsd:string },
element Meat { xsd:string },
((fruit , vegetable?) | (fruit? , vegetable))
}
1 ответ
Для следующей схемы Relax NG требуется хотя бы одна fruit
или один vegetable
и позволяет оба:
start = element foo { (fruit, vegetable?) | (vegetable, fruit?) }
fruit = element fruit { xsd:string }
vegetable = element vegetable { xsd:string }
Я не верю, что вы могли бы использовать шаблон чередования для точного соответствия вашим требованиям.
Я предположил, что вы хотите максимум один fruit
и один vegetable
иначе start
может быть это start = element foo { (fruit | vegetable)+ }
,