XSD - 唯一语句不会阻止重复

时间:2017-01-13 21:45:25

标签: xml xsd key unique

我正在为一些产品索引开发XSD。希望你不介意我用德语名称发布代码;)问题是:我希望我的“artikelgruppe”(= Product-Group)有一个独特的“GRUPPE”(= GroupNumber)。同样适用于“artikel”/“ARTNR”。

<?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 个答案:

答案 0 :(得分: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>