在RELAX NG外部引用中需要一点递归

时间:2012-02-02 06:47:37

标签: xml xsd schema relaxng

我们一直在使用RELAX NG来为我们基于Web的API指定和验证XML消息,我正在做一些大扫除并开始使用<external>元素。

在我们的模式中,我们有一个<subscription>元素,其中包含id和句点等内容,还有<account>。这在RELAX NG中非常简单:

<?xml version="1.0"?>
<element name="subscription" xmlns="http://relaxng.org/ns/structure/1.0">
  <element name="id">
    <text />
  </element>

  <zeroOrMore>
    <externalRef href="./account.xml" />
  </zeroOrMore>
</element>

然后,此模式将包含在特定请求的实际消息模式中。

问题是<account>元素也可能有多个<subscription>元素,具体取决于请求(例如,有时我们会根据帐户信息搜索订阅数据,有时我们会根据订阅数据搜索帐户信息。)

我试过了:

<?xml version="1.0"?>
<element name="account" xmlns="http://relaxng.org/ns/structure/1.0">
  <element name="id">
    <text />
  </element>

  <zeroOrMore>
    <externalRef href="./subscription.xml" />
  </zeroOrMore>
</element>

但是在加载架构时出现了(意外)错误:Detected an externalRef recursion

有没有办法指定某种递归限制 - 某种方式可以知道我当前的<subscription><account>的孩子,所以不应该有<account>个孩子?< / p>

1 个答案:

答案 0 :(得分:1)

只要您指向第一个放松NG中定义的subscription元素,子结构必须与您指向的模式匹配。

为了实现您的目标,您应该为具有不同子结构的另一个subscription元素设置另一个模式定义。

类似的东西:

<define name="subscriptionDEF-2">
    <element name="subscription">
        <text/>
    </element>
</define>

请参阅带有account元素的ref元素。

<element name="account">
    <ref name="subscriptionDEF-2"/>
</element>
相关问题