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

问题描述 投票:1回答:2

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

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调用中...但这对我的目的来说还不够。

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

提前致谢!

oracle soap soa bpel
2个回答
1
投票

我使用转换步骤而不是分配步骤解决了问题。

正确的程序如下:

  1. 将新转换插入BPEL流程。
  2. 选择输入(源)和输出(目标),然后从右侧按钮(绿色+)创建一个新的XSL文件。
  3. 打开新的XSL文件并显示源(左侧)和目标(右侧)中的所有元素。此操作非常重要,如果未显示源数据或目标数据的一部分,则不会链接元素,从而生成错误的映射。
  4. 将元素从源链接到目标,如果屏幕上出现自动映射消息,则选择YES。这将为每个元素插入目标部分,将源列表的所有元素复制到目标中。

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

希望能帮助到你!


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越来越大,使用可重用模板可能是一件好事。特别是你开始在多个项目中重用和导入大型xslts。

无论如何,我希望这能帮助你,祝你好运!

干杯,杰斯珀

© www.soinside.com 2019 - 2024. All rights reserved.