2

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

例如:

我想制作一个以下 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 排序

4

2 回答 2

5

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

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

笔记:

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

  2. 我故意使用否定形式 not(a le b) 因为它适用于所有元素,即使是第一个

  3. 如果您使用 Saxon 作为您的 XSD 1.1 处理器,则“每个用户满足 c”形式的断言在某种意义上被优化,如果断言失败,错误消息将告诉您哪个特定用户未能满足条件。

于 2013-06-28T08:17:07.480 回答
0

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

于 2013-06-28T00:49:58.110 回答