处理BPEL 2.0转换中的元素列表时遇到问题

时间:2018-12-07 13:03:28

标签: oracle soap soa bpel

这些是我工作环境的不同版本:

Jdeveloper v 11.1.1.6.0

BPEL 2.0

Oracle SOA服务器

在BPEL转换步骤中收到元素列表时,我遇到了问题。这种转换是从接收到的SOAP元素(从上一步的输入)获取数据,其目的是生成一个新的SOAP元素,并将其用作下一步的输入,与其他Web服务进行通信。

这是转换中接收到的SOAP元素的结构:

<NameOfRequest  version="1.0"  lang="es">
<idConv>133</idConv>
<gTram>
    <ns2:tipo>TIPO1</ns2:tipo>
    <ns2:anyo>2018</ns2:anyo>
    <ns2:numero>1</ns2:numero>
</gTram>
<ns8:solicitud>
    <ns3:idSolicitud>2</ns3:idSolicitud>
</ns8:solicitud>
<ns8:solicitud>
    <ns3:idSolicitud>1</ns3:idSolicitud>
</ns8:solicitud>
</NameOfRequest>

此外,以下是请求之后的XSD结构:

<xsd:complexType name="ComunicarAltaBdnsBySolicitudesRequestType_v1.0">
    <xsd:complexContent>
        <xsd:extension base="cm:RequestMessageBaseType_v1.0">
            <xsd:sequence>
                <xsd:element name="idConv" type="xsd:long" nillable="false"/>
                <xsd:element name="gTram" type="cgt:CodigoGrupoTramitacionType_v1.0" nillable="false" minOccurs="1"/>
                <xsd:element name="solicitud" type="cso:CodigoSolicitudType_v1.0" minOccurs="1" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="CodigoSolicitudType_v1.0">
        <xsd:sequence>
            <xsd:element name="idSolicitud" minOccurs="1" type="xsd:long"/>
        </xsd:sequence>
    </xsd:complexType>

我需要将所有称为 solicitud 的元素复制到另一个SOAP结构中(对于当前转换之后的新请求)。

我在转换步骤中尝试了不同的过程(每个过程分别是copy,copyList,append等),但是我无法复制所有 solicitud 元素的重复。我甚至尝试将内容复制到新变量中,然后将该变量分配给目标列表。

我获得的最积极的结果是仅将 solicitud 元素之一复制到了新的SOAP调用中……但这对我来说还不够。

关于如何复制所有元素的任何想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我使用 Transformation 步骤而不是Assign步骤解决了问题。

正确的步骤如下:

  1. 在BPEL流程中插入新的转换。

  2. 选择输入(源)和输出(目标),然后从右侧按钮(绿色+)创建一个新的XSL文件。

  3. 打开新的XSL文件,并显示源(左侧)和目标(右侧)中的所有元素。此操作非常重要,如果未显示部分源数据或目标数据,则将不会链接元素,从而生成错误的映射。

  4. 将构成源的元素链接到目标,如果屏幕上出现自动映射消息,则选择YES。这会将for-each元素插入目标部分,并将源列表的所有元素复制到目标中。

通过这种方式可以复制带有列表的元素,而BPEL的Assing操作不支持这种操作。

希望有帮助!

答案 1 :(得分:0)

我确定您使用的映射器会提供类似的解决方案,但这是我通常如何使用xslt将文件从一个位置映射到另一个位置的示例。

<xsl:for-each select="randomPath/ns8:solicitud">
     <xsl:call-template name="exampleTemplateThatFilsYourValues"/>
</xsl:for-each>

<xsl:template name="exampleTemplateThatFilsYourValues">
      <xsl:for-each select="current()/ns:8:solicitud">
                <xsl:element name="targetNamespace:newElement">
                     <xsl:value-of select="current()"/>
                </xsl:element>
      </xsl:for-each>
</xsl:template>

此示例可以通过多种方式扩展,所有这些都可以轻松找到: http://www.xsltfunctions.com/

一个我个人尝试过功能的网站很有趣。您不一定需要使用模板,您可以只在第二个模板中的每个模板中使用每个模板中的零件。那也行得通。但是随着xslts越来越大,使用可重用模板可能是一件好事。特别是您开始在多个项目中重复使用和导入大型xslt。

无论如何,我希望这对您有帮助,祝您好运!

干杯,杰斯珀

相关问题