在 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 步骤解决了问题。
正确的步骤如下:
将新转换插入 BPEL 流程。
Select 输入(源)和输出(目标)并从右侧按钮(绿色 + 按钮)创建一个新的 XSL 文件。
打开新的 XSL 文件并显示源(左侧)和目标(右侧)的所有元素。这个动作很重要,如果有一部分源数据或目标数据没有显示出来,元素就不会链接起来,生成一个坏映射。
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。
总之,希望对你有所帮助,祝你好运!
干杯,杰斯珀
这些是我工作环境的不同版本:
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 步骤解决了问题。
正确的步骤如下:
将新转换插入 BPEL 流程。
Select 输入(源)和输出(目标)并从右侧按钮(绿色 + 按钮)创建一个新的 XSL 文件。
打开新的 XSL 文件并显示源(左侧)和目标(右侧)的所有元素。这个动作很重要,如果有一部分源数据或目标数据没有显示出来,元素就不会链接起来,生成一个坏映射。
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。
总之,希望对你有所帮助,祝你好运!
干杯,杰斯珀