4

我正在尝试通过元素名称验证父元素是否具有唯一的子元素。我还需要验证至少存在一个可能的元素。

例子

<StorageTypes>
    <Status/>
    <Warning/>  
    <Error/>             
</StorageTypes>  

将是有效的,但

<StorageTypes>
    <Status/>
    <Status/>
    <Warning/>  
    <Error/>             
</StorageTypes>  

<StorageTypes>               
</StorageTypes>  

将是无效的。

我曾尝试使用 xs:unique,选择当前节点,但无法一般选择带有字段元素的元素。

下面实现了我想要做的事情,但它不是我正在寻找的强大解决方案。我希望能够添加更多类型,而无需为每次更改更改 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>

这可能吗?这是好习惯吗?任何意见,将不胜感激。

4

1 回答 1

1

基于 XSD 1.0 的通用解决方案是不可能的。我不相信你的独特性也能达到​​你想要的,仅仅因为一个字段的值是使用 text(); 评估的。所以标签的名称永远不会在其中发挥作用......

虽然您可能能够实现接近您想要的东西,但它可能并非在所有情况下都有效,或者它缺乏优雅或可行性......

以下方法可能不被某些人认为是优雅的......但是,它可以达到相同的目的。

例如,如果改为使用属性来捕获“标签”名称,如下所示:

<StorageTypes>
   <Storage type="Status"/>
   <Storage type="Warning"/>
   <Storage type="Error"/>
</StorageTypes>

然后在 @type 字段上写下你的唯一值,并结合一系列存储,maxOccurs=whatever 严格地为你提供你所描绘的内容。

相反,如果您正在寻找实际上具有复杂内容的元素,或者不允许使用属性,那么您可以使用替换组来达到相同的效果。

于 2012-05-10T21:52:44.137 回答