在XML Schema中指定元素列表中的排序

时间:2013-06-27 19:52:53

标签: xml xsd

有没有办法在XML Schema中指定列表的元素必须按某些文本节点排序?

E.g:

我想制作一个以下xml有效的xsd:

<root>
    <Users>
        <User>
            <Id>1</Id>
            <Username>lsuarez</Username>
        </User>
        <User>
            <Id>3</Id>
            <Username>dforlan</Username>
        </User>
        <User>
            <Id>7</Id>
            <Username>ecavanni</Username>
        </User>
    </Users>
</root>

但以下不是:

<root>
    <Users>
        <User>
            <Id>7</Id>
            <Username>ecavanni</Username>
        </User>
        <User>
            <Id>1</Id>
            <Username>lsuarez</Username>
        </User>
        <User>
            <Id>3</Id>
            <Username>dforlan</Username>
        </User>
    </Users>
</root>

也就是说,集合中的元素按User.Id

排序

2 个答案:

答案 0 :(得分:5)

添加到MS-McQ的答案:特别是在XSD 1.1中,您需要对Users元素的复杂类型进行断言,格式为

test="every $u in User satisfies not($u/Id le $u/preceding-sibling::User[1]/Id)"

注意:

  1. 断言不能出现在单个User元素上,因为它是关于以断言出现的元素为根的子树的断言,并且无法访问该子树之外的数据

  2. 我故意使用否定形式(a le b),因为它对所有元素都是正确的,即使是第一个

  3. 如果您使用Saxon作为XSD 1.1处理器,那么“每个用户满足c”形式的断言都会被优化,如果断言失败,错误消息将告诉您哪个特定用户无法满足条件。

答案 1 :(得分:0)

在XSD 1.1中,您可以对用户(或root)使用的类型使用断言来强制执行此操作。我想不出在XSD 1.0中做到这一点的方法(但也许其他一些独创的SO读者可以)。