有没有办法在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
排序答案 0 :(得分:5)
添加到MS-McQ的答案:特别是在XSD 1.1中,您需要对Users元素的复杂类型进行断言,格式为
test="every $u in User satisfies not($u/Id le $u/preceding-sibling::User[1]/Id)"
注意:
断言不能出现在单个User元素上,因为它是关于以断言出现的元素为根的子树的断言,并且无法访问该子树之外的数据
我故意使用否定形式(a le b),因为它对所有元素都是正确的,即使是第一个
如果您使用Saxon作为XSD 1.1处理器,那么“每个用户满足c”形式的断言都会被优化,如果断言失败,错误消息将告诉您哪个特定用户无法满足条件。
答案 1 :(得分:0)
在XSD 1.1中,您可以对用户(或root)使用的类型使用断言来强制执行此操作。我想不出在XSD 1.0中做到这一点的方法(但也许其他一些独创的SO读者可以)。