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>
我使用下面的在線驗證工具:
不幸的是,所有的唯一約束指令似乎做的是限制我到一個單一的客戶ID元素。我收到以下錯誤消息:
**字段'CustomerId'期望值最多。行:1列:271 **
這裏值得一提的是,如果我更改第二個元素的值,我仍然會收到此錯誤消息。這是最令人頭痛的.....
我很確定這不是在線驗證工具的錯。它的工作原理非常好。下面我就發現#1:
How to ensure unique values in an XML Schema-validated document
這整個問題是讓我的精神。我花了幾個小時嘗試各種語法都無濟於事。上面的錯誤信息是儘可能接近我實際上有獨特爲我工作在我的架構.....
有沒有人有任何想法......?
Hi Petru。感謝那一份貢獻。它工作得很好。我無法相信這是我一直在努力的。 ;) – Jimbo 2012-08-14 23:34:38