XSD 对列表中的最后一项应用不同的限制?



如果具有以下形式的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字符串之一只能在列表中的最后一项中使用。

有没有一种干净的方法可以在架构中添加这样的限制?

(我可以创建一个与item几乎相同的itemLast类型,但对valueType具有不同的枚举,但这感觉很混乱,并为任何 XSLT 文件增加了额外的复杂性。

需要您itemLast的想法才能将最后一项与 XSD 1.0 中的其他项区别对待,在 XSD 1.0 中不支持依赖类型。

如果可以使用 XSD 1.1,则可以向msg的内容模型添加一个断言,以对最后一个item施加特殊限制:

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

此断言将放在msg类型定义的结束xs:complexType标记之前。


以下是对上述断言的改进,以允许item元素的空列表:

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

感谢@MichaelKay注意到这个未被揭露的案件。

相关内容

  • 没有找到相关文章

最新更新