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 验证工具

不幸的是,所有唯一约束指令似乎都将我限制为单个 CustomerId 元素。我收到以下错误消息:

**“CustomerId”字段最多需要一个值。行:1 列:271 **

这里值得一提的是,如果我更改第二个元素的值,我仍然会收到此错误消息。最让人头疼的是......

我很确定这不是在线验证工具的问题。它适用于我在 Stackoverflow 上找到的以下示例:

如何确保 XML 模式验证文档中的唯一值

这整个问题都在驱使我思考。我花了几个小时尝试各种语法都无济于事。上面的错误消息与我在我的架构中实际有独特的工作一样接近.....

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

4

1 回答 1

2

你所要做的就是改变这个约束:

在此处输入图像描述

对此:

在此处输入图像描述

相关的 XSD:

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

这个想法是具有值的唯一性,而不是元素的唯一性(这就是错误消息告诉您的内容)。

于 2012-08-14T12:14:20.407 回答