基于多个元素定义唯一约束 [英] define unique constraint based on multiple elements

查看:37
本文介绍了基于多个元素定义唯一约束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的 XML 的简化版本:

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>

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

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>

然而,这似乎并不正确.我为这个约束尝试了几个位置,但文档有效.我的 XSD 文件似乎有效,任何其他 XML 错误都会出现.

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.

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

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>

我将不胜感激.

推荐答案

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

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

将您的架构更改为:

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

这篇关于基于多个元素定义唯一约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆