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



我一直在使用从单一源变量到targe变量的For each。现在,我需要将两个不同的无界变量值映射到一个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>

我试着从订单和选项中分别应用到目标元素,但:(它没有给出例外的输出。

<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

最新更新