【问题标题】:Specify sorting in lists of elements in XML Schema在 XML Schema 中的元素列表中指定排序
【发布时间】:2013-06-27 19:52:52
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    添加到 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”形式的断言在某种意义上得到优化,如果断言失败,错误消息将告诉您哪个特定用户未能满足条件。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Michael,你很清楚这不能在 XSD 1.0 中完成!规则说,如果两个同级元素具有相同的名称,那么它们必须具有相同的类型......但是好吧,我承认不可能证明某事是不可能的。
      猜你喜欢
      • 2012-02-27
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      相关资源
      最近更新 更多