2014-12-17 5 views
1

xsd 스키마에서 고유 요소를 사용하는 방법을 보여주는 많은 예제를 보았지만 성공하지 못했습니다. http://www.freeformatter.com/xml-validator-xsd.html으로 테스트 한 오류 (테스트를위한 더 나은 도구를 알고있는 경우) : "스키마의 콘텐츠가 잘못되었습니다."고유 한 요소가 잘못되었거나 잘못 배치되었거나 너무 자주 발생합니다. "xsd unique constraint is Invalid

XSD :

<xsd:schema xmlns:inf="http://www.example.net/inflation" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:instrument="http://www.example.net/Instrument" targetNamespace="http://www.example.net/inflation" elementFormDefault="qualified" attributeFormDefault="qualified"> 
    <xsd:import namespace="http://www.example.net/Instrument" schemaLocation="instrument.xsd"/> 
    <xsd:element name="inflations" type="inf:Inflations"/> 
    <xsd:complexType name="Inflations"> 
     <xsd:sequence> 
      <xsd:element name="historyTable" type="xsd:string" default="INFLATION_HISTORY"/> 
      <xsd:element name="inflationHistory" type="inf:InflationHistory" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    <xsd:complexType name="InflationHistory"> 
     <xsd:sequence> 
      <xsd:element name="identifier" type="integer"/> 
      <xsd:element name="inflation" type="inf:Inflation" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 


    <!-- Uniqueness --> 
    <xsd:unique name="CodeUniqueKey"> 
    <xsd:selector xpath="inf:inflationHistory" /> 
    <xsd:field xpath="inf:identifier" /> 
    </xsd:unique> 
</xsd:schema> 

답변

1

고유 제한 조건이 있으므로, 요소 선언의 내부 가고 있습니다

<xsd:element name="inflations" type="inf:Inflations> 
    <xsd:unique name="CodeUniqueKey"> 
    ... 
    </xsd:unique> 
</xsd:element> 
+1

왜 고유 제한 조건이 요소 내부에 가야합니까? 나는 뒤에 논리를하지 않습니까? 요소가 중요합니까? 아니면 어떤 요소라도 괜찮습니까? – taktak004

+2

@ taktak004는 포함 요소 선언을 고유성 제약 조건의 "범위", 즉 사물이 고유해야하는 그룹으로 생각합니다. 제약 조건은 "같은'inflations' 부모 내의 모든'inflationHistory' 엘리먼트는 다른 식별자 값을 가져야 만합니다. 이 경우 스키마는 하나의 전역 요소 만 선언하기 때문에 전역 적으로 고유해야한다는 것을 의미하지만 일반적으로 범위 지정은 의미가 있습니다. 고전 서점 예를 들어, 한 서가의 모든 서적이 다른 이름을 갖도록하고 다른 서가에서 같은 이름을 사용할 수 있도록 할 수 있습니다. –