在RelaxNG中,我想描述一个类似于此的结构:
<parent>
<subelem1>
<subelem1>
<subelem1>
...
</parent>
或:
<parent>
<subelem2>
<subelem2>
<subelem2>
...
</parent>
我尝试了以下rng:
<rng:element name="parent">
<rng:choice>
<rng:zeroOrMore>
<rng:ref name="subelem1"/>
</rng:zeroOrMore>
<rng:zeroOrMore>
<rng:ref name="subelem2"/>
</rng:zeroOrMore>
</rng:choice>
</rng:element>
但是在Python中使用lxml
验证,我只收到错误消息Did not expect element subelem1 there
。
那里有什么问题?
答案 0 :(得分:1)
我使用了与你的模式略有不同的模式,但功能应该相同:
<rng:grammar
xmlns:rng="http://relaxng.org/ns/structure/1.0"
xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<rng:start>
<rng:ref name="dparent"/>
</rng:start>
<rng:define name="dparent">
<rng:element name="parent">
<rng:choice>
<rng:zeroOrMore>
<rng:element name="subelem2">
<rng:empty/>
</rng:element>
</rng:zeroOrMore>
<rng:zeroOrMore>
<rng:element name="subelem1">
<rng:empty/>
</rng:element>
</rng:zeroOrMore>
</rng:choice>
</rng:element>
</rng:define>
使用jing和xmllint(如果我没记错的话,使用libxml2和python中的lxml一样)可以很好地验证你的样本文档。我建议比较你的完整语法(我假设你只发布了部分内容)和上面的内容。此外,我更正了您的命名空间(choice
元素不在一个)。如果你仍然无法验证我会建议问题是lxml
而不是语法。