有没有办法在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排序
添加到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)
笔记:
断言不能在单个User元素上,因为它是关于以断言出现的元素为根的子树的断言,并且无法访问该子树之外的数据
我故意使用否定形式(a le b)因为它对所有元素都是正确的,即使是第一个
如果您使用Saxon作为XSD 1.1处理器,那么"每个用户满足c"形式的断言都会被优化,因为如果断言失败,错误消息将告诉您哪个特定用户无法满足条件.