如何在Xquery中映射抽象的XSD元素?

时间:2012-09-28 21:20:17

标签: xsd xquery osb

我有一个我在Xquery请求中定义的表单。此表单构建在XSD架构上。

我的表单:

<xsd:element name="AddInsuranceToOrderForm">
        <xsd:complexType>
              <xsd:sequence>
                    <xsd:element name="OrderId" type="xsd:long" minOccurs="1" maxOccurs="1"/>
                    <xsd:element name="DistributionChannel" type="xsd:long" minOccurs="1" maxOccurs="1"/>
                    <xsd:element name="FloatNumber" type="xsd:long" minOccurs="1" maxOccurs="1"/>
                    <xsd:element name="UserId" type="xsd:long" minOccurs="1" maxOccurs="1"/>
                    <xsd:element name="SalesId" type="xsd:long" minOccurs="1" maxOccurs="1"/>
                    <xsd:element name="TotalDue" type="xsd:decimal" minOccurs="1" maxOccurs="1"/>
                    <xsd:element name="ChangeDue" type="xsd:decimal" minOccurs="1" maxOccurs="1"/>
                    **<xsd:element ref="tns:tenderItem" minOccurs="0" maxOccurs="unbounded"/>**
                    <xsd:element name="ProtectionPlans" type="tns:ProtectionPlanItemType" minOccurs="0" maxOccurs="unbounded"/>
                    <xsd:element name="InsurancePlans" type="tns:FeatureItemType" minOccurs="0" maxOccurs="unbounded"/>
              </xsd:sequence>
        </xsd:complexType>
  </xsd:element>

通知tenderItems是一个参考。它的来源是:

<xsd:element abstract="true" name="tenderItem" type="tns:TenderType"/>
  <xsd:complexType name="TenderType">
        <xsd:sequence>
              <xsd:element maxOccurs="1" minOccurs="0" name="date" type="xsd:dateTime"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="lineNumber" type="xsd:string"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="tenderId" type="xsd:long"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="returnTenderId" type="xsd:long"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="tenderType" type="tns:TenderTypeType"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="amount" type="xsd:decimal"/>
              <xsd:element maxOccurs="1" minOccurs="0" name="signature" type="tns:SignatureType"/>
        </xsd:sequence>
  </xsd:complexType>

有几个特定的​​招标扩展了我想要添加到我的Xquery请求的tenderType。 以下是一个示例:

      <xsd:element name="billToAccount" substitutionGroup="tns:tenderItem" type="tns:BillToAccountType"/>
  <xsd:complexType name="BillToAccountType">
        <xsd:complexContent>
              <xsd:extension base="tns:TenderType">
                    <xsd:sequence>
                          <xsd:element maxOccurs="1" minOccurs="0" name="accountId" type="xsd:long"/>
                          <xsd:element maxOccurs="1" minOccurs="0" name="subscriptionId" type="xsd:string"/>
                          <xsd:element maxOccurs="1" minOccurs="0" name="chargeDescription" type="xsd:string"/>
                          <xsd:element maxOccurs="unbounded" minOccurs="0" name="lineItems" type="tns:BillToAccountLineItemType"/>
                    </xsd:sequence>
              </xsd:extension>
        </xsd:complexContent>
  </xsd:complexType>

那么在Xquery中如何完成?我尝试了以下内容:

{
    for $BillToAccount in $addInsuranceToOrderABM1/ns3:MessagePayload/ns3:AddInsuranceToOrder/ns1:AddInsuranceToOrderDataArea/ns2:TenderItem
        return
            <ns2:billToAccount>
                {
                    for $Date in $BillToAccount/ns0:Date
                    return
                        <ns2:date>{ data($Date) }</ns2:date>
                }…
}

我为每个tenderType执行了此操作,但映射器不支持XML元素。

1 个答案:

答案 0 :(得分:1)

您可以使用schema-element(ns3:tenderItem)来匹配该替换组中的任何元素。

import schema default element namespace "http://www.example.com/xml-namespace/" at "schema.xsd";

declare variable $input as schema-element(AddInsuranceToOrderForm)
   := validate { doc('data.xml')/AddInsuranceToOrderForm };

for $item in $input/schema-element(tenderItem)
return $item

schema.xsd为:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    xmlns:tns="http://www.example.com/xml-namespace/"
    targetNamespace="http://www.example.com/xml-namespace/">
    <xsd:element name="AddInsuranceToOrderForm">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="OrderId" type="xsd:long" minOccurs="1" maxOccurs="1"/>
                <xsd:element name="DistributionChannel" type="xsd:long" minOccurs="1" maxOccurs="1"/>
                <xsd:element name="FloatNumber" type="xsd:long" minOccurs="1" maxOccurs="1"/>
                <xsd:element name="UserId" type="xsd:long" minOccurs="1" maxOccurs="1"/>
                <xsd:element name="SalesId" type="xsd:long" minOccurs="1" maxOccurs="1"/>
                <xsd:element name="TotalDue" type="xsd:decimal" minOccurs="1" maxOccurs="1"/>
                <xsd:element name="ChangeDue" type="xsd:decimal" minOccurs="1" maxOccurs="1"/>
                <xsd:element ref="tns:tenderItem" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element abstract="true" name="tenderItem" type="tns:TenderType"/>
    <xsd:complexType name="TenderType">
        <xsd:sequence>
            <xsd:element maxOccurs="1" minOccurs="0" name="date" type="xsd:dateTime"/>
            <xsd:element maxOccurs="1" minOccurs="0" name="lineNumber" type="xsd:string"/>
            <xsd:element maxOccurs="1" minOccurs="0" name="tenderId" type="xsd:long"/>
            <xsd:element maxOccurs="1" minOccurs="0" name="returnTenderId" type="xsd:long"/>
            <xsd:element maxOccurs="1" minOccurs="0" name="amount" type="xsd:decimal"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:element name="BillToAccount" substitutionGroup="tns:tenderItem" type="tns:BillToAccountType"/>
    <xsd:complexType name="BillToAccountType">
        <xsd:complexContent>
            <xsd:extension base="tns:TenderType">
                <xsd:sequence>
                    <xsd:element maxOccurs="1" minOccurs="0" name="accountId" type="xsd:long"/>
                    <xsd:element maxOccurs="1" minOccurs="0" name="subscriptionId" type="xsd:string"/>
                    <xsd:element maxOccurs="1" minOccurs="0" name="chargeDescription" type="xsd:string"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:schema>

并且data.xml为:

<?xml version="1.0" encoding="UTF-8"?>
<AddInsuranceToOrderForm xmlns="http://www.example.com/xml-namespace/">
    <OrderId>1</OrderId>
    <DistributionChannel>1</DistributionChannel>
    <FloatNumber>1</FloatNumber>
    <UserId>1</UserId>
    <SalesId>1</SalesId>
    <TotalDue>1</TotalDue>
    <ChangeDue>1</ChangeDue>
    <BillToAccount>
        <date>2012-10-01T23:59:59</date>
        <lineNumber>line 1</lineNumber>
        <tenderId>1</tenderId>
        <returnTenderId>1</returnTenderId>
        <amount>1.2</amount>
        <accountId>1</accountId>
        <subscriptionId>1</subscriptionId>
        <chargeDescription>1</chargeDescription>
    </BillToAccount>
</AddInsuranceToOrderForm>

提供输出:

<?xml version="1.0" encoding="UTF-8"?>
<BillToAccount xmlns="http://www.example.com/xml-namespace/">
    <date>2012-10-01T23:59:59</date>
    <lineNumber>line 1</lineNumber>
    <tenderId>1</tenderId>
    <returnTenderId>1</returnTenderId>
    <amount>1.2</amount>
    <accountId>1</accountId>
    <subscriptionId>1</subscriptionId>
    <chargeDescription>1</chargeDescription>
</BillToAccount>