2013-12-10 31 views
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> 

我会明白任何帮助。

回答

0

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

您的架构改成这样:

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

非常感谢你,这是解决方案。我必须承认,我不知道寻址规则,所以我不知道@地址属性。 – AndyZ

+0

您的欢迎 - 总是乐于提供帮助。 [MSDN XPath示例](http://msdn.microsoft.com/zh-cn/library/ms256086.aspx)提供了很好的参考。 – Filburt

+0

这个主题对我来说是全新的。现在我想知道我的题目是否应该编辑。它不应该更像是“基于多个元素定义唯一约束”,现在我认为我的标题是误导性的。 – AndyZ