基于多个元素定义唯一约束

时间:2013-12-10 13:02:08

标签: xml xsd unique-constraint

以下是我的XML的简化版本:

    <Invoice>
           <DataRow>
           <Group>ZB</Group>
           <Specie>M</Specie>
           <Length>360</Length>
      </DataRow>
      <DataRow>
           <Group>ZB</Group>
           <Specie>M</Specie>
           <Length>360</Length>
      </DataRow>
    </Invoice>

我希望不验证此XML,因为Group / Specie / Length的值是相同的。所以我想在我的XSD文件中添加一个唯一约束。 我有这个独特的约束:

  <xs:unique name="specieSizeGroupLengthAssortment">
       <xs:selector xpath="Invoice/DataRow"/>
       <xs:field xpath="@Specie"/>
       <xs:field xpath="@Group"/>
       <xs:field xpath="@Length"/>
  </xs:unique>

但是,这似乎不正确。我为这个约束尝试了几个位置,但文档验证了。 我的XSD文件似乎是有效的,任何其他XML错误都可以解决。

以下是我的XSD的完整副本,它具有完整的属性名称,因此与上面的简化版本存在一些差异。

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Invoice" >
    <xs:complexType>
        <xs:sequence>
            <xs:element type="xs:date" name="EntryDate" minOccurs="1" maxOccurs="1"/>
            <xs:element name="InvoiceNumber" minOccurs="1" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="20"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element type="xs:date" name="InvoiceDate" minOccurs="1" maxOccurs="1"/>
            <xs:element  name="ContractNumber" minOccurs="1" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="0"/>
                        <xs:maxLength value="20"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="MeasurerDocNr" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="20"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element  name="TransportJobNr" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="0"/>
                        <xs:maxLength value="15"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="Supplier" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="Name" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1"/>
                                    <xs:maxLength value="140"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="RegNr" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1"/>
                                    <xs:maxLength value="20"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="Reciever" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="Name" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1"/>
                                    <xs:maxLength value="140"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="RegNr" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="6"/>
                                    <xs:maxLength value="20"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="Carrier" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="FirmName" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="0"/>
                                    <xs:maxLength value="140"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="TruckNumber" minOccurs="0" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="0"/>
                                    <xs:maxLength value="20"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="Driver" minOccurs="0" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="0"/>
                                    <xs:maxLength value="100"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="Measuring" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element type="xs:string" name="MeasuringDate" minOccurs="1" maxOccurs="1"/>
                        <xs:element  name="OperatorName" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="6"/>
                                    <xs:maxLength value="20"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="MeasureMethod" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:pattern value="[I,K]"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="AssortmOrigin" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element  name="FSCNumber" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="0"/>
                                    <xs:maxLength value="20"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="SlashCode" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="0"/>
                                    <xs:maxLength value="20"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="DataRow" maxOccurs="unbounded" minOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element  name="AssortmentGroup" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="2"/>
                                    <xs:maxLength value="2"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="Specie" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="A"/>
                                    <xs:enumeration value="B"/>
                                    <xs:enumeration value="Ba"/>
                                    <xs:enumeration value="M"/>
                                    <xs:enumeration value="L"/>
                                    <xs:enumeration value="Oz"/>
                                    <xs:enumeration value="Os"/>
                                    <xs:enumeration value="LK"/>
                                    <xs:enumeration value="SK"/>
                                    <xs:enumeration value="E"/>
                                    <xs:enumeration value="P"/>
                                    <xs:enumeration value="JK"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="SizeGroup" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1"/>
                                    <xs:maxLength value="18"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="Length" minOccurs="1" maxOccurs="1" >
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:pattern value="[1-9][0-9]{0,6}"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="RejectReason" minOccurs="0" maxOccurs="1" >
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="M"/>
                                    <xs:enumeration value="D"/>
                                    <xs:enumeration value="T"/>
                                    <xs:enumeration value="Z"/>
                                    <xs:enumeration value="R"/>
                                    <xs:enumeration value="G"/>
                                    <xs:enumeration value="S"/>
                                    <xs:enumeration value="3"/>
                                    <xs:enumeration value="4"/>
                                    <xs:enumeration value="N"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="Assortment" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1"/>
                                    <xs:maxLength value="8"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="Diameter" minOccurs="0" maxOccurs="1">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="LowerLimit" minOccurs="1" maxOccurs="1">
                                        <xs:simpleType>
                                            <xs:restriction base="xs:string">
                                                <xs:pattern value="[1-9][0-9]{0,6}"/>
                                            </xs:restriction>
                                        </xs:simpleType>
                                    </xs:element>
                                    <xs:element name="UpperLimit" minOccurs="1" maxOccurs="1">
                                        <xs:simpleType>
                                            <xs:restriction base="xs:string">
                                                <xs:pattern value="[1-9][0-9]{0,6}"/>
                                            </xs:restriction>
                                        </xs:simpleType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element  name="Overlength" minOccurs="0" maxOccurs="1" >
                            <xs:simpleType>
                                <xs:restriction base="xs:decimal">
                                    <xs:minInclusive value="0"/>
                                    <xs:fractionDigits value="3"/>
                                    <xs:totalDigits value="5"/>
                                </xs:restriction> 
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="LengthReduction" minOccurs="0" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:decimal">
                                    <xs:minInclusive value="0"/>
                                    <xs:fractionDigits value="3"/>
                                    <xs:totalDigits value="7"/>
                                </xs:restriction> 
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="DiamterReduction" minOccurs="0" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:decimal">
                                    <xs:minInclusive value="0"/>
                                    <xs:fractionDigits value="3"/>
                                    <xs:totalDigits value="7"/>
                                </xs:restriction> 
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="GrosVolume" minOccurs="0" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:decimal">
                                    <xs:minExclusive value="0"/>
                                    <xs:fractionDigits value="3"/>
                                    <xs:totalDigits value="7"/>
                                </xs:restriction> 
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="NetVolume" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:decimal">
                                    <xs:minExclusive value="0"/>
                                    <xs:fractionDigits value="3"/>
                                    <xs:totalDigits value="7"/>
                                </xs:restriction> 
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="Count" minOccurs="0" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:pattern value="[1-9][0-9]{0,4}"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="NotAgreed" minOccurs="1" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:pattern value="[1,0]"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="Price" minOccurs="0" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:decimal">
                                    <xs:minExclusive value="0"/>
                                    <xs:fractionDigits value="2"/>
                                    <xs:totalDigits value="10"/>
                                </xs:restriction> 
                            </xs:simpleType>
                        </xs:element>
                        <xs:element  name="PriceTotal" minOccurs="0" maxOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:decimal">
                                    <xs:minExclusive value="0"/>
                                    <xs:fractionDigits value="2"/>
                                    <xs:totalDigits value="10"/>
                                </xs:restriction> 
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>

            </xs:element>

        </xs:sequence>

    </xs:complexType>
    <xs:unique name="specieSizeGroupLengthAssortment">
                <xs:selector xpath="Invoice/DataRow"/>
                <xs:field xpath="@Spiecie"/>
                <xs:field xpath="@SizeGroup"/>
                <xs:field xpath="@Length"/>
                <xs:field xpath="@Assortment"/>
            </xs:unique>
</xs:element>

我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的字段xpath表示属性(@Group,...),而您想要的关键字段是元素。

将架构更改为:

<xs:unique name="specieSizeGroupLengthAssortment">
    <xs:selector xpath="DataRow"/>
    <xs:field xpath="Specie"/>
    <xs:field xpath="Group"/>
    <xs:field xpath="Length"/>
</xs:unique>