我试图通过元素名称验证父元素是否具有唯一的子元素。 我还需要验证至少存在一个可能的元素。
实施例
<StorageTypes>
<Status/>
<Warning/>
<Error/>
</StorageTypes>
会有效,但
<StorageTypes>
<Status/>
<Status/>
<Warning/>
<Error/>
</StorageTypes>
和
<StorageTypes>
</StorageTypes>
无效。
我尝试过使用xs:unique,选择当前节点,但无法一般性地选择带有field元素的元素。
以下是我想要做的事情,但它不是我想要的强大解决方案。我希望能够添加更多类型,而不是为每次更改更改xpath。
<element ect.>
<xs:unique name="something">
<xs:selector xpath="."/>
<xs:field xpath="Status"/>
<xs:field xpath="Warning"/>
<xs:field xpath="Error"/>
</xs:unique>
</element>
这可能吗?这是好习惯吗?任何建议将不胜感激。
答案 0 :(得分:1)
无法使用基于XSD 1.0的通用解决方案。我不相信你的独特性能达到你想要的,只是因为使用text()来评估一个字段的值;所以标签的名称永远不会发挥作用......
虽然你可能能够达到你想要的东西,但它可能不适用于所有场景,或者它缺乏优雅或可行性......
以下方法可能不被某些人视为优雅......尽管如此,它可以起到同样的作用。
例如,如果您使用属性来捕获“标记”名称,请执行以下操作:
<StorageTypes>
<Storage type="Status"/>
<Storage type="Warning"/>
<Storage type="Error"/>
</StorageTypes>
然后在@type字段上编写您的唯一内容,结合一系列存储,maxOccurs = whatever会严格按照您的描述提供。
如果您正在寻找实际上具有复杂内容的元素,或者不允许使用属性,那么您可以使用替换组来达到相同的效果。