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

mmu*_*lva 2 xml xsd

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

例如:

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

<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>
Run Code Online (Sandbox Code Playgroud)

但以下不是:

<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>
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*Kay 5

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

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

笔记:

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

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

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