【问题标题】:Problem handling a list of elements in BPEL 2.0 transformation处理 BPEL 2.0 转换中的元素列表的问题
【发布时间】:2019-05-09 06:09:12
【问题描述】:

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

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>

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

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

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

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

提前致谢!

【问题讨论】:

    标签: oracle soap soa bpel


    【解决方案1】:

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

    正确的步骤如下:

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

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

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

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

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

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      我确信您使用的映射器提供了类似的解决方案,但这里有一个示例,说明我通常如何使用 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。

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

      干杯,杰斯帕

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-03
        • 2019-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-01
        • 1970-01-01
        相关资源
        最近更新 更多