【问题标题】:RelaxNG: <choice> containing <zeroOrMore>RelaxNG: <choice> 包含 <zeroOrMore>
【发布时间】:2011-12-15 14:48:22
【问题描述】:

在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

怎么了?

【问题讨论】:

  • 实际上上面的代码可以正常工作,这要归功于 Nic Gibson 的编辑。

标签: xml validation relaxng


【解决方案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>

使用jingxmllint(如果我没记错的话,它使用 libxml2 和 python 中的 lxml 一样)验证了您的示例文档。我建议将您的完整语法(我假设您只发布其中的一部分)与上述内容进行比较。此外,我更正了您的名称空间(choice 元素不在一个中)。如果您仍然无法验证,我建议问题出在lxml 而不是语法。

【讨论】:

  • 感谢您的编辑 - 我的 rng 中的选择元素也没有命名空间...
  • 那就是问题所在了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 2014-03-27
  • 2016-12-18
  • 1970-01-01
相关资源
最近更新 更多