以下是我的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>
我将不胜感激。
答案 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>