两个无界的源变量到单个无界的目标变量的映射

问题描述

我一直在使用For-each从Single源变量到targe变量。现在,我需要将两个不同的无界变量值映射到单个Target变量。

下面是我为交易创建的XSD模式。

<?xml version="1.0" encoding="UTF-8"?>
<schema attributeFormDefault="unqualified" elementFormDefault="qualified"
        targetNamespace="http://xmlns.oracle.com/SOATEST/SEQ/SEQBPELProcess" xmlns="http://www.w3.org/2001/XMLSchema">
  <element name="Request">
    <complexType>
      <sequence>
        <element name="Orders" maxOccurs="unbounded">
          <complexType>
            <sequence>
              <element name="Name" type="string"/>
              <element name="OrderID" type="int"/>
              <element name="Qty" type="int"/>
              <element name="Price" type="int"/>
            </sequence>
          </complexType>
        </element>
        <element name="Options" maxOccurs="unbounded">
          <complexType>
            <sequence>
              <element name="Description" type="string"/>
              <element name="catlog" type="string"/>
              <element name="Segment" type="string"/>
            </sequence>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>
  <element name="Response">
    <complexType>
      <sequence>
        <element name="Details" maxOccurs="unbounded">
        <complexType>
            <sequence>
              <element name="OrderID" type="string"/>
              <element name="Name" type="string"/>
              <element name="Catlog" type="string"/>
              <element name="Segment" type="string"/>
            </sequence>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>
</schema>

所以我将请求同时放入Orders和Options元素。

<?xml version="1.0" encoding="UTF-8" ?>
<Request xmlns="http://xmlns.oracle.com/SOATEST/SEQ/SEQBPELProcess">
   <Orders>
      <Name>KIHUN</Name>
      <OrderID>101</OrderID>
      <Qty>3</Qty>
      <Price>4584</Price>
   </Orders>
   <Orders>
      <Name>VENCRI</Name>
      <OrderID>102</OrderID>
      <Qty>4</Qty>
      <Price>98547</Price>
   </Orders>
   <Options>
      <Description>DRONWADRO</Description>
      <catlog>EMPTU</catlog>
      <Segment>HASBK</Segment>
      <OrderID>101</OrderID>
   </Options>
   <Options>
      <Description>WAROAIRDRO</Description>
      <catlog>FULLSTC</catlog>
      <Segment>UVSS</Segment>
     <OrderID>102</OrderID>
   </Options>
</Request>

除了输出将是

<?xml version = '1.0' encoding = 'UTF-8'?>
<ns0:Response xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns0="http://xmlns.oracle.com/SOATEST/SEQ/SEQBPELProcess">
   <ns0:Details>
      <ns0:OrderID>101</ns0:OrderID>
      <ns0:Name>KIHUN</ns0:Name>
      <ns0:Catlog>EMPTU</ns0:Catlog>
      <ns0:Segment>HASBK</ns0:Segment>
   </ns0:Details>
   <ns0:Details>
      <ns0:OrderID>102</ns0:OrderID>
      <ns0:Name>VENCRI</ns0:Name>
      <ns0:Catlog>FULLSTC</ns0:Catlog>
      <ns0:Segment>UVSS</ns0:Segment>
   </ns0:Details>
</ns0:Response>

我尝试通过订单和选项将for-each应用于目标元素,但:(它没有给出例外的输出

<ns0:Response>
         <xsl:for-each select="/ns0:Request/ns0:Orders">
            <xsl:for-each select="/ns0:Request/ns0:Options">
               <ns0:Details>

有人可以帮我解决这个问题吗?

解决方法

您可以这样做:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://xmlns.oracle.com/SOATEST/SEQ/SEQBPELProcess"
    version="1.0">

  <xsl:output method="xml" indent="yes"/>
  
  <xsl:key name="options_key" match="ns0:Options" use="ns0:OrderID"/>

  <xsl:template match="/">
      <ns0:Response xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
          <xsl:apply-templates select="ns0:Request/ns0:Orders"/>
      </ns0:Response>
  </xsl:template>
  
  <xsl:template match="ns0:Orders">
      <ns0:Details>
          <ns0:OrderID><xsl:value-of select="ns0:OrderID"/></ns0:OrderID>
          <ns0:Name><xsl:value-of select="ns0:Name"/></ns0:Name>
          <ns0:Catlog><xsl:value-of select="key('options_key',ns0:OrderID)/ns0:catlog"/></ns0:Catlog>
          <ns0:Segment><xsl:value-of select="key('options_key',ns0:OrderID)/ns0:Segment"/></ns0:Segment>
      </ns0:Details>
  </xsl:template>

  
</xsl:stylesheet>

看到它在这里工作:https://xsltfiddle.liberty-development.net/93dFKa5