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。ただし、それらを1つにグループ化するだけですenumType

それを修正するために私が見ることができる唯一の方法は、<key>forenumValuesenumType要素に移動する(そして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の例を許可し、次のフラグメント(2つ1の'を含む)を禁止するという点で機能します。

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

これがあなたのために働くかどうか私に知らせてください。これを表現する他の方法があるかどうかにも興味があります。

于 2010-12-10T23:21:17.270 に答える
0

<xs:element name="enumTypes">xs:keyステートメントは要素内に書き込まれると思います。それで :

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