这些是我工作环境的不同版本:
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调用中……但这对我来说还不够。
关于如何复制所有元素的任何想法吗?
谢谢!
答案 0 :(得分:1)
我使用 Transformation 步骤而不是Assign步骤解决了问题。
正确的步骤如下:
在BPEL流程中插入新的转换。
选择输入(源)和输出(目标),然后从右侧按钮(绿色+)创建一个新的XSL文件。
打开新的XSL文件,并显示源(左侧)和目标(右侧)中的所有元素。此操作非常重要,如果未显示部分源数据或目标数据,则将不会链接元素,从而生成错误的映射。
将构成源的元素链接到目标,如果屏幕上出现自动映射消息,则选择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。
无论如何,我希望这对您有帮助,祝您好运!
干杯,杰斯珀