1
這裏是我的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,因爲集團/樹種/長度值相同。所以我想在我的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>
我會明白任何幫助。
非常感謝你,這是解決方案。我必須承認,我不知道尋址規則,所以我不知道@地址屬性。 – AndyZ
您的歡迎 - 總是樂於提供幫助。 [MSDN XPath示例](http://msdn.microsoft.com/zh-cn/library/ms256086.aspx)提供了很好的參考。 – Filburt
這個主題對我來說是全新的。現在我想知道我的題目是否應該編輯。它不應該更像是「基於多個元素定義唯一約束」,現在我認爲我的標題是誤導性的。 – AndyZ