2017-01-13 3 views
0

일부 제품 색인은 XSD에서 작동합니다. 문제는 다음과 같습니다. "artikelgruppe"(= Product-Group)에 고유 한 "GRUPPE"(= GroupNumber)를 갖기를 원합니다. "artikel"/ "ARTNR"도 마찬가지입니다.XSD - 고유 한 문으로 중복을 막지 못합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:element name="artikelkatalog"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="artikelgruppen"> 
       <xsd:complexType> 
        <xsd:sequence> 
         <xsd:element name="artikelgruppe" maxOccurs="unbounded"> 
          <xsd:complexType> 
           <xsd:sequence> 
            <xsd:element name="GRUPPE" type="xsd:integer"> 
            </xsd:element> 
            <xsd:element name="GRUP_TXT" type="xsd:string"> 
            </xsd:element> 
           </xsd:sequence> 
          </xsd:complexType> 
         </xsd:element> 
        </xsd:sequence> 
       </xsd:complexType> 
       <xsd:unique name="unique_GRUPPE"> 
       <xsd:selector xpath="artikelgruppe" /> 
       <xsd:field xpath="@GRUPPE" /> 
       </xsd:unique> 
      </xsd:element> 
     <xsd:element name="alle_artikel"> 
      <xsd:complexType> 
       <xsd:sequence> 
        <xsd:element name="artikel" minOccurs="0" maxOccurs="unbounded"> 
         <xsd:complexType> 
          <xsd:sequence> 
           <xsd:element name="ARTNR" type="xsd:integer"> 
           </xsd:element> 
           <xsd:element name="ARTBEZ" type="xsd:string"> 
           </xsd:element> 
           <xsd:element name="EKPREIS" type="xsd:float"> 
           </xsd:element> 
           <xsd:element name="EKWAEHRUNG" type="xsd:string"> 
           </xsd:element> 
           <xsd:element name="VPREIS" type="xsd:float"> 
           </xsd:element> 
           <xsd:element name="VWAEHRUNG" type="xsd:string"> 
           </xsd:element> 
           <xsd:element name="GRUPPE" type="xsd:integer"> 
           </xsd:element> 
          </xsd:sequence> 
         </xsd:complexType> 
        </xsd:element> 
       </xsd:sequence> 
      </xsd:complexType> 
      <xsd:unique name="unique_ARTNR"> 
      <xsd:selector xpath="artikel" /> 
      <xsd:field xpath="@ARTNR" /> 
      <!--<xsd:keyref name="keyref_GRUPPE_REFERENZ" refer="unique_ARTNR"> 
      <xsd:selector xpath="artikelgruppe" /> 
      <xsd:field xpath="@ARTNR"/> 
      </xsd:keyref>--> 
      </xsd:unique> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

내 코드는 오류가 발생하지 않습니다,하지만 일을하지 않습니다 :(나는이 공급 :

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> 
<artikelkatalog> 
    <artikelgruppen> 
     <artikelgruppe> 
      <GRUPPE>20</GRUPPE> 
      <GRUP_TXT>Workstation</GRUP_TXT> 
     </artikelgruppe> 
     <artikelgruppe> 
      <GRUPPE>20</GRUPPE> 
      <GRUP_TXT>Server</GRUP_TXT> 
     </artikelgruppe> 
     <artikelgruppe> 
      <GRUPPE>30</GRUPPE> 
      <GRUP_TXT>Monitor</GRUP_TXT> 
     </artikelgruppe> 
    </artikelgruppen> 
    <alle_artikel> 
     <artikel> 
      <ARTNR>1100</ARTNR> 
      <ARTBEZ>Transtec 800</ARTBEZ> 
      <EKPREIS>720.00</EKPREIS> 
      <EKWAEHRUNG>€</EKWAEHRUNG> 
      <VPREIS>749.00</VPREIS> 
      <VWAEHRUNG>€</VWAEHRUNG> 
      <GRUPPE>10</GRUPPE> 
     </artikel> 
     <artikel> 
      <ARTNR>1100</ARTNR> 
      <ARTBEZ>Trinitron 17"</ARTBEZ> 
      <EKPREIS>375.00</EKPREIS> 
      <EKWAEHRUNG>$</EKWAEHRUNG> 
      <VPREIS>399.00</VPREIS> 
      <VWAEHRUNG>$</VWAEHRUNG> 
      <GRUPPE>20</GRUPPE> 
     </artikel> 
    </alle_artikel> 
</artikelkatalog> 

를 그리고이 문제는 무엇 :(과 기계가 괜찮다고?

답변

1

XPath 표현식에서 @ 문자는 속성을 선택하지만, 예에서는 키가 저장됩니다 (주석이없는 keyref 문을 참조하십시오). 속성 값이 아니라 요소 값으로 사용됩니다. 단순히 필드 선택기에서 @을 제거하고 고유성 제약이 잘 작동합니다 : artikelgruppe에는 ARTNR가 없기 때문에

<xsd:field xpath="GRUPPE" /> 
... 
<xsd:field xpath="ARTNR" /> 

주석으로 부분은, 많은 이해가되지 않습니다. 두 개의 요소 그룹 사이에 GRUPPE 번호 인 을 참조한다고 가정합니다. 이 경우

상기 keyref이 공통 조상 요소에 지정되어야 즉 artikelkatalog :

<xsd:element name="artikelkatalog"> 
    <xsd:complexType> 
    ... 
    </xsd:complexType> 

    <xsd:keyref name="keyref_GRUPPE_REFERENZ" refer="unique_GRUPPE"> 
    <xsd:selector xpath="alle_artikel/artikel" /> 
    <xsd:field xpath="GRUPPE"/> 
    </xsd:keyref> 

</xsd:element>