В 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)+ },

Другие вопросы по тегам