2012-02-02 46 views
0

我們已經使用RELAX NG指定和驗證XML消息我們基於Web的API,和我在做一些打掃房間,並開始利用<external>元素。需要一點點遞推RELAX NG外部引用

在我們的模式中,我們有一個<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>孩子本身?

回答

1

只要你指向你定義的第一RELAX NG的subscription元件,所述substruture必須匹配你都指向圖案。

爲了達到你的目標,你應該有一個不同的子另一subscription元素另一種模式的定義。

喜歡的東西:

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

,並參閱如果您account元素與ref元素。

<element name="account"> 
    <ref name="subscriptionDEF-2"/> 
</element>