2010-09-01 44 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

相关问题