Question

J'ai essayé d'obtenir la contrainte de UNIQUE placé sur certains attributs que j'ai dans un XSD assez basique schéma. J'utilise XMLSpy et je suis désireux de mettre une contrainte unique autour TEMPLATE.ID pour mes noeuds (par exemple, il est important qu'ils restent uniques).

Je l'ai mis en place le ci-dessous et essayé ce qui suit:

Secenario 1

<xs:unique name="uniqueviewid">
  <xs:selector xpath="./views"/>
  <xs:field xpath="@id"/>
</xs:unique>

Résultat: XSD: Ok Confirme. XML mais ne respecte Valide pas la contrainte unique (par exemple deux ou plusieurs éléments avec le même ID ne sont pas pris en charge

Scénario 2

<xs:unique name="uniqueviewid">
  <xs:selector xpath="views"/>
  <xs:field xpath="@id"/>
</xs:unique>

** Résultats * Même scénario 1. XSD XML valident mais ne tient pas compte @id Valide double dans l'élément de vue

Scénario 3

<xs:unique name="uniqueviewid">
  <xs:selector xpath="*"/>
  <xs:field xpath="@id"/>
</xs:unique>

Résultats: XSD et XML Validats Valide et respecte l'UNIQUE constrint (si des vues en double avec @id il jette un invaldation selon la conception).

Le problème est que la wild card est « * » ce qui signifie que tous les sous-noeuds sous VIEWPODS seront validés, qui IsNot ce que je veux. Je veux plutôt le contraint à se concentrer sur VIEWPOS / VUES / @ ID chemin exact.

Je pense que mon XPATH est tout faux, mais je ne peux pas penser à ce que je fais spécifiquement tort?


Le XML exemple.

Ceci est le code XML exemple.

<config xmlns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/RIAGenicConfig.xsd RIAGenicConfig.xsd">
  <view>
    <viewpods>
      <views id="view1"/>
      <views id="view1"/>
    </viewpods>
  </view>
</config>

La XSD en question.

<xs:schema xmlns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:mstns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tempuri.org/RIAGenicConfig.xsd" elementFormDefault="qualified" id="RIAGenicConfig">
  <xs:element name="config">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="view">
          <xs:complexType>
            <xs:choice>
              <xs:element name="viewpods">
                <xs:complexType>
                  <xs:choice>
                    <xs:element name="views" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:attribute name="id"/>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="blah"/>
                  </xs:choice>
                </xs:complexType>
                <xs:unique name="uniqueviewid">
                  <xs:selector xpath="*"/>
                  <xs:field xpath="@id"/>
                </xs:unique>
              </xs:element>
            </xs:choice>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
Était-ce utile?

La solution

Qualifier la sélection XPath pour mstns: vues au lieu de * (tous les éléments):

<xs:unique name="uniqueviewid">
  <xs:selector xpath="mstns:views"/>
   <xs:field xpath="@id"/>
</xs:unique>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top