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

如何在Xquery中映射抽象XSD元素?,xsd,xquery,osb,Xsd,Xquery,Osb,我在Xquery请求中定义了一个表单。此表单基于XSD架构构建 我的表格: <xsd:element name="AddInsuranceToOrderForm"> <xsd:complexType> <xsd:sequence> <xsd:element name="OrderId" type="xsd:long" minOccurs="1" maxOccurs="1"

我在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>
<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>
      <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>
{
    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>
                }…
}

****
注意tenderItems是一个参考。它的来源如下:

<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>
<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>
      <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>
{
    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>
                }…
}

有几个特定的投标书扩展了我想添加到Xquery请求中的tenderType这里有一个例子:

<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>
<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>
      <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>
{
    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>
                }…
}

那么在Xquery中是如何做到这一点的呢?我尝试了以下方法:

<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>
<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>
      <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>
{
    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>
                }…
}
{
对于$BillToAccount in$addInsuranceToOrderABM1/ns3:MessagePayload/ns3:AddInsuranceToOrder/ns1:AddInsuranceToOrderDataArea/ns2:TenderItem
返回
{
对于$BillToAccount中的$Date/ns0:Date
返回
{数据($日期)}
}…
}

我对每个tenderType都这样做了,但是映射程序不支持XML元素。

您可以使用
模式元素(ns3:tenderItem)
来匹配该替换组中的任何元素

导入架构默认元素命名空间”http://www.example.com/xml-namespace/在“schema.xsd”;
将变量$input声明为架构元素(AddInsuranceToOrderForm)
:=验证{doc('data.xml')/AddInsuranceToOrderForm};
对于$input/schema元素中的$item(tenderItem)
退货$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>
给出输出:

<?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>

2012-10-01T23:59:59
第1行
1.
1.
1.2
1.
1.
1.