2017-07-27 16 views
0

xsdは要素の重複値を防止する必要があります。私はいろいろな方法で試してみましたが、要素のユニークな制約を達成するために何とか見逃しましたxsdを介したxmlのユニークな要素の値

以下のXMLでは、xyz:interval要素の値が重複しています。 一意のタグを使用して複製を回避するにはどうすればよいですか?

私はXSD以下でユニークを使用しようとしましたが、これを達成できませんでした。

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> 

答えて

0

実は、あなたがIntervalsのあなたの定義に代わり "無制限" のmaxOccursの= "1" を変更することができます。あなたはXPath式で定義した名前空間を配置する必要があります(コメントの後)

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

EDIT

  1. コメントで述べたように、uniqueelementの適用範囲に当てはまります。レベルが低すぎると定義しました。

には、例えば、次のようにChild要素のスコープ内で一意性を定義することができます。

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

次に、あなたの他の要素のためにそれを同じ方法で行う必要があるでしょう(または定義を再設計する)。

+0

私は複数の間隔定義を持つことができますが、それらの値は同じではありません。値が繰り返されると、xsdは検証に失敗します。 – user1529282

+0

OK、質問が正しく表示されませんでした。固有の要素の適用範囲が適用されますが、complexTypeに適用する場合は不可能です(https://stackoverflow.com/questions/32826828/unique-constraint-on-a-complextype-in​​steadを参照)。要素のおそらく、あなたはxsdとタイプの定義を再設計しなければならないでしょう。 –

関連する問題