0

我们一直在使用 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>孩子本身?

4

1 回答 1

1

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

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

就像是 :

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

account并从你的元素中引用 ifref元素。

<element name="account">
    <ref name="subscriptionDEF-2"/>
</element>
于 2012-02-16T10:32:12.840 回答