XSD对列表中的最后一项施加不同的限制?

问题描述 投票:0回答:1

如果有一个XML格式的形式。

<msg>
   <item id="0" valueType="xxx"/>
   <item id="1" valueType="xxx"/>
   <item id="2" valueType="xxx"/>
   ...
   <item id="n" valueType="yyy"/>
</msg>

项目是复杂的类型,其元素和属性由一个模式管理。valueType 属性可以使用枚举中定义的多个字符串之一。然而,这些字符串中的一个 valueType 字符串可 只是 在列表的最后一项中使用。

有没有一种简单的方法可以在模式中添加这样的限制?

( 我可以创建一个 itemLast 彷彿 item 但对 valueType 但这感觉很乱,并且给任何XSLT文件增加了额外的复杂性。)

xml xsd xsd-validation xml-validation
1个回答
0
投票

您的 itemLast 的想法,以区别对待XSD 1.0中的其他项目,因为XSD 1.0不支持依赖类型。

如果您可以使用 XSD 1.1,您可以在内容模型的 msg 对最后一个人施加特别的限制。item:

<xs:assert test="item[last()]/@valueType = 'yyy'"/>

此项主张将放在结尾之前。xs:complexType 标签的 msg 类型定义。


这里是对上述断言的一个改进,允许一个空列表的 item 元素。

<xs:assert test="not(item) or item[last()]/@valueType = 'yyy'"/>

感谢@MichaelKay指出了这个未被发现的案例。

© www.soinside.com 2019 - 2024. All rights reserved.