2010-09-01 19 views
1

我正在使用RELAX NG開發一個模式。我對此很新,所以很可能忽視了一些顯而易見的事情,但似乎沒有一種方便的方式來指定XML模式語言中元素的出現次數。如何在RELAX NG中指定出現的數字範圍?

例如,假設我想指定A元素可能包含2 - 5個B元素。我不想使用​​3210或oneOrMore標籤,因爲我實際上對元素數量有上限。在XML Schema中,我可以使用minOccursmaxOccurs屬性來緊湊地指定。我已閱讀了official RELAX NG tutorial,刪除了the spec,並完成了一些基本的Google搜索,但我一直無法找到任何使用RELAX NG的方法。我可以找出最好的,你需要做這樣的事情:

<element name="A"> 
    <ref name="B"/> 
    <ref name="B"/> 
    <optional><ref name="B"/></optional> 
    <optional><ref name="B"/></optional> 
    <optional><ref name="B"/></optional> 
</element> 

<define name="B"> 
    <element name="B"> 
    <text/> 
    </element> 
</define> 

這是可行的,但將開始尋找醜陋當你需要出現一個更大的數字。在我的實際模式中,我有一個可能發生多達256次的元素類型,所以手動指定的可選元素將會很笨重。如果需要,我會做,但我想知道是否有更優雅的方式來表達我的出現限制。

回答

3

真的沒有一個非常笨拙的方式在RELAX NG中這麼做恐怕。

我想採取兩種方法之一。要麼建立的模式,或者使用Schematron的註解和過程的環境下,你可以同時使用兩種語言做的過程:

例如,建立乙元素組:

<define name="B2"> 
    <ref name="B"/> 
    <optional><ref name="B"/></optional> 
</define> 

<define name="B4"> 
    <ref name="B2"/> 
    <ref name="B2"/> 
</define> 

讓你慢慢建立起來的羣體(在這種情況下),一個或兩個元素,然後是2-4個元素等等。組合不同的組可以讓你指定適當的計數(最終)。

另外,您可以使用Schematron的註釋:

<?xml version="1.0" encoding="utf-8"?> 
<grammar xmlns="http://relaxng.org/ns/structure/1.0" 
    xmlns:s="http://www.ascc.net/xml/schematron"> 

    <element name="A"> 
     <s:rule context="A"> 
     <!-- note - using XPath 2 here --> 
     <s:assert test='count(B) lt 6'>A elements may contain no more than 6 B elements</s:assert> 
     </s:rule> 
     <ref name="B"/> 
     <oneOrMore><ref name="B"/></oneOrMore> 
    </element> 

    <define name="B"> 
     <element name="B"> 
     <text/> 
     </element> 
    </define> 

</grammar> 

我傾向於更喜歡後者,因爲它使對更簡單的架構,它並不難混合使用這兩個,而是它不依賴於您的驗證環境。

+0

感謝您的建議!我曾想到你的第一個方法,但決定反對它。第二種方法似乎不會太麻煩。我可能會最終使用這個。 – 2010-09-03 17:30:11