Question

Here is a simplified version of my 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>

I want this XML to be not validated, because the values of Group/Specie/Length are the same. So I want to add an unique constraint in my XSD file. I've got this for the unique constraint:

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

However, this does not seem to be correct. I tried several positions for this constraint, but the document validates. My XSD file seems to be valid, and any other XML errors get cought.

Here is a full copy of my XSD, it has the full attribute names, so there are some differences from the simplified version above.

<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>

I will appreciate any help.

Was it helpful?

Solution

Your field xpath denotes attributes (@Group,...) whereas your desired key fields are elements.

Change your schema to this:

<xs:unique name="specieSizeGroupLengthAssortment">
    <xs:selector xpath="DataRow"/>
    <xs:field xpath="Specie"/>
    <xs:field xpath="Group"/>
    <xs:field xpath="Length"/>
</xs:unique>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top