2017-01-13 7 views
0

im работает над 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> 

И машина была отлично с ним :(Что случилось? См. Заявление без рамок keyref: Это будет вишня сверху;) Большое спасибо.

ответ

1

В выражении XPath символ @ выбирает атрибут. Однако в вашем примере ключи хранятся как значения элементов, а не как атрибуты. Просто удалите @ из поля селекторов и единственности ограничения должны работать нормально:

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

Закомментированный раздел не имеет особого смысла, потому что нет ARTNR в artikelgruppe. Я предполагаю, что вы хотели бы указать номер 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>