2017-07-27 3 views
0

J'ai un xsd qui doit empêcher les valeurs en double pour un élément. J'ai essayé de diverses manières et manquais d'une manière ou d'une autre pour obtenir une contrainte unique pour un élément.Valeur d'élément unique en xml via xsd

Dans le xml ci-dessous, j'ai xyz: intervalle élément ayant des valeurs en double. Comment éviter la duplication en utilisant une étiquette unique?

J'ai essayé d'utiliser unique en dessous de XSD, mais n'a pas pu atteindre le même.

XSD:

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema xmlns:xyz="http://www.example.com/schema/public/" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.example.com/schema/public/" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:complexType name="Intervals"> 
    <xs:sequence> 
     <xs:element name="interval" type="xs:int" maxOccurs="unbounded"> 
      <xs:unique name="alias_unique"> 
       <xs:selector xpath="supportedMeasurementIntervals" /> 
       <xs:field xpath="." /> 
      </xs:unique> 
     </xs:element> 
     <xs:element name="defaultInterval" type="xs:int" minOccurs="1" maxOccurs="1" /> 
    </xs:sequence> 
</xs:complexType> 
<xs:element name="NoOfPeriod" type="xs:int" /> 
<xs:element name="isPeriodSupported" type="xs:boolean" /> 
<xs:element name="MType"> 
    <xs:complexType mixed="true"> 
     <xs:sequence minOccurs="0"> 
      <xs:element name="SIntervals" type="xyz:Intervals" minOccurs="0" maxOccurs="1" /> 
     </xs:sequence> 
     <xs:attribute name="id" type="xs:string" use="required" /> 
    </xs:complexType> 
</xs:element> 
<xs:group name="Child"> 
    <xs:sequence> 
     <xs:element name="SIntervals" type="xyz:Intervals" minOccurs="1" maxOccurs="1" /> 
     <xs:element ref="xyz:NoOfPeriod" minOccurs="1" maxOccurs="1" /> 
     <xs:element ref="xyz:isPeriodSupported" minOccurs="1" maxOccurs="1" /> 
    </xs:sequence> 
</xs:group> 
<xs:element name="Parent"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Child" minOccurs="1" maxOccurs="1"> 
       <xs:complexType> 
        <xs:group ref="xyz:Child" /> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="MTypes" minOccurs="1" maxOccurs="1"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element ref="xyz:MType" maxOccurs="unbounded" /> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<xyz:Parent xmlns:xyz="http://www.example.com/schema/public/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/schema/public/"> 
    <xyz:Child> 
     <xyz:SIntervals> 
      <xyz:interval>1111</xyz:interval> 
      <xyz:interval>1111</xyz:interval> 
      <xyz:interval>1111</xyz:interval> 
      <xyz:interval>9727</xyz:interval> 
      <xyz:defaultInterval>504</xyz:defaultInterval> 
     </xyz:SIntervals> 
     <xyz:NoOfPeriod>4804</xyz:NoOfPeriod> 
     <xyz:isPeriodSupported>1</xyz:isPeriodSupported> 
    </xyz:Child> 
    <xyz:MTypes> 
     <xyz:MType id="string" /> 
     <xyz:MType id="string" /> 
     <xyz:MType id="string"> 
      <xyz:SIntervals> 
       <xyz:interval>2222</xyz:interval> 
       <xyz:interval>2222</xyz:interval> 
       <xyz:defaultInterval>6631</xyz:defaultInterval> 
      </xyz:SIntervals> 
     </xyz:MType> 
     <xyz:MType id="string" /> 
    </xyz:MTypes> 
</xyz:Parent> 

Répondre

0

En fait, vous pouvez changer le maxOccurs = "1" au lieu de "unbounded" dans la définition de Intervals.

[.....] 
    <xs:complexType name="Intervals"> 
     <xs:sequence> 
       <xs:element name="interval" type="xs:int" maxOccurs="1"> 
    [.....] 

EDIT (Après le commentaire)

  1. vous devez mettre votre défini l'espace de noms dans l'expression XPath.
  2. comme indiqué dans le commentaire, les unique s'appliquent à la portée du element. vous l'avez défini un niveau trop bas.

par exemple, vous pouvez définir le caractère unique dans le cadre de l'élément Child comme suit:

<xs:group name="Child"> 
<xs:sequence> 
    <xs:element name="SIntervals" type="xyz:Intervals" minOccurs="1" maxOccurs="1" > 
     <xs:unique name="uniqueInterval"> 
      <xs:selector xpath="xyz:interval" /> 
      <xs:field xpath="." /> 
     </xs:unique> 
    </xs:element> 
    <xs:element ref="xyz:NoOfPeriod" minOccurs="1" maxOccurs="1" /> 
    <xs:element ref="xyz:isPeriodSupported" minOccurs="1" maxOccurs="1" /> 
</xs:sequence> 

Vous aurez alors de le faire de la même façon pour vos autres éléments (ou vous re-concevez la définition).

+0

Je peux avoir plusieurs définitions d'intervalle mais pas les valeurs pour qu'elles soient identiques. Le xsd devrait échouer la validation si les valeurs sont répétées. – user1529282

+0

OK, je n'ai pas bien compris la question. l'unique s'applique à la portée de l'élément, mais ici, vous voulez l'appliquer à un complexType, ce qui n'est pas possible, voir https://stackoverflow.com/questions/32826828/unique-contraint-on-a-complextype-instead -of-an-element. Peut-être que vous aurez à revoir votre xsd et la définition des types. –