我们一直在使用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>
答案 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>