这是XSD schema with unordered required, optional and arbitrary tags
的后续问题我正在尝试使用以下约束制作RNG模式:
使用previous question中的示例,我提出了以下RNG架构:
<grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="person">
<interleave> <!-- no ordering -->
<element name="name"> <!-- appears exactly once -->
<data type="string"/>
</element>
<optional> <!-- appears 0 or 1 times -->
<element name="age">
<data type="integer"/>
</element>
</optional>
<zeroOrMore> <!-- appears 0 or more times -->
<element name="phone">
<data type="integer"/>
</element>
</zeroOrMore>
<ref name="anything"/> <!-- allow any element -->
</interleave>
</element>
</start>
<define name="anything">
<zeroOrMore>
<choice>
<element>
<anyName>
<except>
<name>name</name>
<name>age</name>
<name>phone</name>
</except>
</anyName>
<ref name="anything"/>
</element>
<attribute>
<anyName/>
</attribute>
<text/>
</choice>
</zeroOrMore>
</define>
</grammar>
很容易满足前三个约束,但对于第四个(允许无法识别的元素),我无法找到一个很好的解决方案。我所做的是将"anything"
定义为一个或多个无法识别的元素,然后在<person>
元素中引用它。问题是我必须在<anyName>
中明确指定例外:它应匹配任何非"name"
,"age"
或"phone"
的元素。如果我遗漏<except>
,我会收到以下错误:
people.rng:5: element interleave: Relax-NG parser error : Element or text conflicts in interleave
具有明确异常的解决方案看起来笨拙和hackish。是否有更好的方法允许任何不被识别的元素?是否有类似于XSD&#39; <any>
的内容?
答案 0 :(得分:0)
我认为这是Relax NG的唯一解决方案。 IMO并不是那么笨拙,但我不知道XSD的any
是什么样的。