在Relax NG中,如何定义至少需要一个元素的2个元素?

时间:2014-03-07 23:18:08

标签: xml relaxng-compact

我需要编写一个xml架构(我正在使用relax NG来生成一个rng ...),它需要2个不同元素中的至少1个。因此,如果元素是'水果'和'蔬菜',可接受的xml将包含水果,蔬菜或两者。

<fruit>apple</fruit> <vegetable>broccoli</vegetable>

这是我到目前为止所做的,但这是水果或蔬菜,如果你既不通过水果NOR蔬菜,它也有效...

& (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 个答案:

答案 0 :(得分:2)

以下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)+ }