3

我有以下 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 中是唯一的,但到目前为止,我只能强制它们在所有 enumType 中是唯一的。

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

任何帮助,将不胜感激!

4

2 回答 2

3

我认为您只给出了xsd的一部分?如果您可以提供工作片段,则更容易调试。我添加了一个环境<element name="root">以使其验证。

问题似乎是enumValueKey选择器将所有的enumValues, 跨越所有enumType的 ; 但您只想将它​​们归为一组enumType

我能看到修复它的唯一方法是将<key>for移动enumValuesenumType元素中(并调整xpath选择器),所以整个事情变成:

<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>

这是有效的,因为它允许您的 XML 示例,并且它应该禁止以下片段(带有两个1's):

...
<enumType id="2">
  <enumValue id="1" value="Item1"/>
  <enumValue id="1" value="Item2"/>
</enumType>
...

让我知道这是否适合您。如果有任何其他方式来表达这一点,我也很感兴趣。

于 2010-12-10T23:21:17.270 回答
0

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

<xs:element name="enumTypes">
 ... what you want ...
 <xs:key ... and so on
</xs:element> 
于 2010-12-09T20:41:06.133 回答