2011-05-25 81 views
1

我有一个用于xml验证的xsd模式。此架构定义了一个元素:xsd中的增量元素值

<xsd:element name="num" default="0"> 
    <xsd:simpleType> 
    <xsd:union memberTypes="xsd:integer xsd:positiveInteger" /> 
    </xsd:simpleType> 
</xsd:element> 

还有为num元素值的唯一约束。

我想要的是要求元素值以升序排列。我该怎么做呢?也许一个循环或一个位置检查,或者也许有可能分配一些增量值的元素?

的样本数据:

<num>0</num> 
<num>1</num> 
<num>2</num> 
<num>3</num> 

回答

2

这是不可能指定使用XSD架构这样的限制。您可以使用Schematron模式语言指定这样的约束。

例如

<sch:rule context="num[preceding-sibling::num]"> 
    <sch:let name="the-preceding-value" value="preceding-sibling::num[1]"/> 
    <sch:let name="the-value" value="."/> 
    <sch:assert test="number($the-value) = (number($the-preceding-value)+1)">The value 
     <sch:value-of select="$the-value"/> is not in sequence; it must be <sch:value-of 
    select="$the-preceding-value + 1"/></sch:assert> 
</sch:rule> 
0

在XSD 1.1(在Xerces和撒克逊目前实施的),你可以对NUM元素的父类的断言:

<xs:assert test="every $i in 1 to count(num) satisfies num[$i] = $i - 1"/> 

(请注意,它不能是一个断言num元素本身,因为元素的有效性不允许依赖于其自身内容之外的任何元素。)