XMl架构:父级中的唯一键值

时间:2010-12-07 19:57:30

标签: xml xsd xml-validation

我有以下XML:

    <enumTypes xmlns="tempURI">
    <enumType id="1">
        <enumValue id="1" value="Item1"/>
        <enumValue id="2" value="Item2"/>
        <enumValue id="3" value="Item3"/>
    </enumType>
    <enumType id="2">
        <enumValue id="1" value="Item1"/>
        <enumValue id="2" value="Item2"/>
    </enumType>
</enumTypes>

我也有以下架构:

                <xs:element name="enumTypes">
                <xs:complexType>
                    <xs:sequence minOccurs="1" maxOccurs="unbounded">
                        <xs:element name="enumType">
                            <xs:complexType>
                                <xs:sequence minOccurs="1" maxOccurs="unbounded">
                                    <xs:element name="enumValue">
                                        <xs:complexType>
                                            <xs:attribute name="id" type="xs:string" use="required"/>
                                            <xs:attribute name="value" type="xs:string" use="required"/>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                                <xs:attribute name="id" type="xs:string"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
    <xs:key name="enumTypeKey">
        <xs:selector xpath="enumTypes/enumType"/>
        <xs:field xpath="@id"/>
    </xs:key>
    <xs:key name="enumValueKey">
        <xs:selector xpath="enumTypes/enumType/enumValue"/>
        <xs:field xpath="@id"/>
    </xs:key>

我正在尝试强制enumValue ID在enumType中是唯一的,但到目前为止我只能强制它在所有enumTypes中强制它们是唯一的。

我猜我的选择器XPath存在问题,但我似乎无法解决它。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

我认为你只提供了xsd的片段?如果您可以提供工作代码段,则更容易调试。我添加了一个周围的<element name="root">以使其验证。

问题似乎是enumValueKey选择器对所有enumValues中的所有enumType进行了分组;但您只想将这些内容归为一个enumType

我能看到解决问题的唯一方法是将<key>的{​​{1}}移到enumValues元素中(并调整enumType选择器),这样整个事情变成了:

xpath

这是有效的,因为它允许你的XML示例,并且它禁止使用以下片段(有两个<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="enumTypes"> <xs:complexType> <xs:sequence minOccurs="1" maxOccurs="unbounded"> <xs:element name="enumType"> <xs:complexType> <xs:sequence minOccurs="1" maxOccurs="unbounded"> <xs:element name="enumValue"> <xs:complexType> <xs:attribute name="id" type="xs:string" use="required"/> <xs:attribute name="value" type="xs:string" use="required"/> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="id" type="xs:string"/> </xs:complexType> <xs:key name="enumValueKey"> <xs:selector xpath="enumValue"/> <xs:field xpath="@id"/> </xs:key> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:key name="enumTypeKey"> <xs:selector xpath="enumTypes/enumType"/> <xs:field xpath="@id"/> </xs:key> </xs:element> </xs:schema> ):

1

如果这对您有用,请告诉我。如果还有其他方法可以表达这一点,我也很感兴趣。

答案 1 :(得分:0)

我认为你的xs:key语句将在<xs:element name="enumTypes">元素内写入。所以:

<xs:element name="enumTypes">
 ... what you want ...
 <xs:key ... and so on
</xs:element>