2012-08-14 53 views
2

我有下面的XML文檔:難度成功定義的唯一約束

<?xml version="1.0"?> 
<BillingRunParameters> 
<BusinessUnit BillFullBusinessUnit="false">XXXXXXXX</BusinessUnit> 
<Portal BillFullPortal="false">XXXXXXX</Portal> 
<BillingTargets> 
    <CustomerIdList CustomerBilling="true"> 
    <CustomerId>1234567891</CustomerId> 
    <CustomerId>1234567891</CustomerId> 
    </CustomerIdList> 
    <TransactionIdList TransactionBilling="true" ApplicationTransactions="true"> 
    <TransactionId>12345ABC</TransactionId> 
    <TransactionId>1232K89C</TransactionId> 
    </TransactionIdList> 
</BillingTargets> 
</BillingRunParameters> 

我已經把下面的XML Schema一起驗證它。我的XSD在CustomerId元素上包含一個唯一約束。可以存在多個CustomerId元素,但不能超過一個包含相同的值(如上所述)。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" version="1.0" xdb:storeVarrayAsTable = "true"> 
    <xs:element name="BillingRunParameters" xdb:defaultTable="XSD_BILLING_PARAMETERS"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="BusinessUnit" type="typeBusinessUnit" minOccurs="1" maxOccurs="1"/> 
     <xs:element name="Portal" type="typePortal" minOccurs="1" maxOccurs="1"/> 
     <xs:element name="BillingTargets" type="typeBillingTargets" minOccurs="0" maxOccurs="1" xdb:defaultTable="XSD_BILLING_TARGETS"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="testCustomerIdUnique"> 
     <xs:selector xpath="BillingTargets/CustomerIdList"/> 
     <xs:field xpath="CustomerId"/> 
    </xs:unique> 
    </xs:element> 

    <xs:simpleType name="valiatorBusinessUnit"> 
    <xs:restriction base="xs:string"> 
     <xs:minLength value="1"/> 
     <xs:maxLength value="30"/> 
    </xs:restriction> 
    </xs:simpleType> 
    <xs:complexType name="typeBusinessUnit"> 
    <xs:simpleContent> 
     <xs:extension base="valiatorBusinessUnit"> 
     <xs:attribute name="BillFullBusinessUnit" type="xs:boolean" use="required"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType > 

    <xs:simpleType name="valiatorPortal"> 
    <xs:restriction base="xs:string"> 
     <xs:minLength value="1"/> 
     <xs:maxLength value="30"/> 
    </xs:restriction> 
    </xs:simpleType> 
    <xs:complexType name="typePortal"> 
    <xs:simpleContent> 
     <xs:extension base="valiatorPortal"> 
     <xs:attribute name="BillFullPortal" type="xs:boolean" use="required"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 

    <xs:complexType name="typeBillingTargets"> 
    <xs:sequence> 
     <xs:element name="CustomerIdList" type="typeCustomerIdList" minOccurs="1" maxOccurs="1"/> 
     <xs:element name="TransactionIdList" type="typeTransactionIdList" minOccurs="1" maxOccurs="1"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="typeCustomerIdList"> 
    <xs:sequence> 
     <xs:element name="CustomerId" type="typeCustomerId" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    <xs:attribute name="CustomerBilling" type="xs:boolean" use="required"/> 
    </xs:complexType> 
    <xs:simpleType name="typeCustomerId"> 
    <xs:restriction base="xs:string"> 
     <xs:minLength value="1"/> 
     <xs:maxLength value="20"/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="typeTransactionIdList"> 
    <xs:sequence> 
     <xs:element name="TransactionId" type="typeTransactionId" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    <xs:attribute name="TransactionBilling" type="xs:boolean" use="required"/> 
    <xs:attribute name="ApplicationTransactions" type="xs:boolean" use="required"/> 
    </xs:complexType> 
    <xs:simpleType name="typeTransactionId"> 
    <xs:restriction base="xs:string"> 
     <xs:minLength value="1"/> 
     <xs:maxLength value="20"/> 
    </xs:restriction> 
    </xs:simpleType> 

</xs:schema> 

我使用下面的在線驗證工具:

XML-XSD Validation Tool

不幸的是,所有的唯一約束指令似乎做的是限制我到一個單一的客戶ID元素。我收到以下錯誤消息:

**字段'CustomerId'期望值最多。行:1列:271 **

這裏值得一提的是,如果我更改第二個元素的值,我仍然會收到此錯誤消息。這是最令人頭痛的.....

我很確定這不是在線驗證工具的錯。它的工作原理非常好。下面我就發現#1:

How to ensure unique values in an XML Schema-validated document

這整個問題是讓我的精神。我花了幾個小時嘗試各種語法都無濟於事。上面的錯誤信息是儘可能接近我實際上有獨特爲我工作在我的架構.....

有沒有人有任何想法......?

回答

2

所有你需要做的就是改變這一約束:

enter image description here

要這樣:

enter image description here

相關XSD:

<xs:unique name="testCustomerIdUnique"> 
    <xs:selector xpath="BillingTargets/CustomerIdList/CustomerId"/> 
    <xs:field xpath="."/> 
</xs:unique> 

的想法是有獨特的價值,而不是th e元素(這是錯誤信息告訴你的)。

+0

Hi Petru。感謝那一份貢獻。它工作得很好。我無法相信這是我一直在努力的。 ;) – Jimbo 2012-08-14 23:34:38