我有一个看起来非常像这样的RelaxNG架构:
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="xml">
<zeroOrMore>
<element name="multi">
<data type="string"/>
</element>
</zeroOrMore>
<optional>
<element name="optional">
<data type="string"/>
</element>
</optional>
</element>
</start>
</grammar>
我想允许0-N multi
个标签,但是0-1 optional
。只要multis在可选项之前就可以正常工作,但是从relative order matters in RNG开始,如果它们之后出现则会失败:
有效:
<xml>
<optional/>
</xml>
<xml>
<multi/>
<multi/>
<optional/>
</xml>
无效:
<xml>
<optional/>
<multi/>
<multi/>
</xml>
那么如何允许任意顺序但保留约束呢?我尝试将整个事件包装在<zeroOrMore><choice>
块中,这允许任意顺序,但也允许任意数量的可选标记通过。
答案 0 :(得分:4)
如果我正确理解了您的问题,那么您要实现的目标是通过使用<interleave/>
模式来实现的:
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="xml">
<interleave>
<zeroOrMore>
<element name="multi">
<data type="string"/>
</element>
</zeroOrMore>
<optional>
<element name="optional">
<data type="string"/>
</element>
</optional>
</interleave>
</element>
</start>
</grammar>
这将验证任何序列或零个或一个optional
元素以及零个或多个multi
元素,包括您的示例。