在 BPEL 2.0 转换中处理元素列表时出现问题

Problem handling a list of elements in BPEL 2.0 transformation

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

Jdeveloper 11.1.1.6.0

BPEL 2.0

Oracle SOA 服务器

我在 BPEL 转换步骤中收到元素列表时遇到问题。此转换是从接收到的 SOAP 元素(来自上一步的输入)获取数据,其 objective 是生成一个新的 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>

另外,下面一个是Request后面的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 结构中(对于新请求,在当前转换之后)。

我在转换步骤中尝试了不同的过程(对于每个、复制、复制列表、追加等),但我无法复制 solicitud 元素的所有重复.我什至尝试将内容复制到一个新变量中,然后将此变量分配给目标列表。

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

知道如何复制所有元素吗?

提前致谢!

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

正确的步骤如下:

  1. 将新转换插入 BPEL 流程。

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

  3. 打开新的 XSL 文件并显示源(左侧)和目标(右侧)的所有元素。这个动作很重要,如果有一部分源数据或目标数据没有显示出来,元素就不会链接起来,生成一个坏映射。

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

以这种方式工作允许使用列表复制元素,使用 BPEL 的 Assing 操作不支持这种方式。

希望对您有所帮助!

我确定您使用的映射器提供了类似的解决方案,但这是我通常如何使用 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 越来越大,使用可重复使用的模板可能是一件好事。特别是您开始在多个项目中重用和导入大型 xslts。

总之,希望对你有所帮助,祝你好运!

干杯,杰斯珀