在 Oracle SOA XSL 转换中迭代游标
Iterate over cursor in Oracle SOA XSL transform
我有一个基本的应用程序,我从数据库中获取贷款产品列表并显示给用户。我写了一个 xsl 转换文件,我在其中迭代结果集并将每一行添加为贷款产品。但是最后的List里面填满了同样的对象。
我的composite.xml:
GetLoanProductsBPEL 内容:
和 GetLoanProductsBPEL 组件内的 Transform1 文件内容:
在数据库中我有 3 个贷款产品:
但结果我得到了相同贷款产品的 3 个实例:
<env:Body>
<inp1:GetLoanProductsResponse xmlns:inp1="http://xmlns.oracle.com/singleString">
<inp1:LoanProduct>
<inp1:Id>1</inp1:Id>
<inp1:Name>Cash loan</inp1:Name>
<inp1:MaxAmount>100000</inp1:MaxAmount>
<inp1:InterestRate>12</inp1:InterestRate>
<inp1:MaxPeriod>60</inp1:MaxPeriod>
</inp1:LoanProduct>
<inp1:LoanProduct>
<inp1:Id>1</inp1:Id>
<inp1:Name>Cash loan</inp1:Name>
<inp1:MaxAmount>100000</inp1:MaxAmount>
<inp1:InterestRate>12</inp1:InterestRate>
<inp1:MaxPeriod>60</inp1:MaxPeriod>
</inp1:LoanProduct>
<inp1:LoanProduct>
<inp1:Id>1</inp1:Id>
<inp1:Name>Cash loan</inp1:Name>
<inp1:MaxAmount>100000</inp1:MaxAmount>
<inp1:InterestRate>12</inp1:InterestRate>
<inp1:MaxPeriod>60</inp1:MaxPeriod>
</inp1:LoanProduct>
</inp1:GetLoanProductsResponse>
</env:Body>
当我查看 Flow Trace 时,我发现在 Invoke 中我得到了 3 条不同的记录,但在 Transform1 之后,相同的记录被写入了 3 次。
调用 1 跟踪:
转换后的回复输出:
Transform1 XSLT 文件源代码:
<?xml version="1.0" encoding="UTF-8" ?>
<?oracle-xsl-mapper
<!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. -->
<mapSources>
<source type="WSDL">
<schema location="../payments_dwh.wsdl"/>
<rootElement name="VMbLoanProductsCollection" namespace="http://xmlns.oracle.com/pcbpel/adapter/db/top/payments_dwh"/>
</source>
</mapSources>
<mapTargets>
<target type="WSDL">
<schema location="../GetLoanProductsBPEL.wsdl"/>
<rootElement name="processResponse" namespace="http://xmlns.oracle.com/PashaMobileBankingWs/PashaMobileBankingWS/GetLoanProductsBPEL"/>
</target>
</mapTargets>
<!-- GENERATED BY ORACLE XSL MAPPER 11.1.1.7.0(build 130301.0647.0008) AT [WED OCT 19 17:41:51 AZST 2016]. -->
?>
<xsl:stylesheet version="1.0"
xmlns:client="http://xmlns.oracle.com/PashaMobileBankingWs/PashaMobileBankingWS/GetLoanProductsBPEL"
xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20"
xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:top="http://xmlns.oracle.com/pcbpel/adapter/db/top/payments_dwh"
xmlns:mhdr="http://www.oracle.com/XSL/Transform/java/oracle.tip.mediator.service.common.functions.MediatorExtnFunction"
xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
xmlns:oraext="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dvm="http://www.oracle.com/XSL/Transform/java/oracle.tip.dvm.LookupValue"
xmlns:hwf="http://xmlns.oracle.com/bpel/workflow/xpath"
xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:med="http://schemas.oracle.com/mediator/xpath"
xmlns:ids="http://xmlns.oracle.com/bpel/services/IdentityService/xpath"
xmlns:bpm="http://xmlns.oracle.com/bpmn20/extensions"
xmlns:xdk="http://schemas.oracle.com/bpel/extension/xpath/function/xdk"
xmlns:xref="http://www.oracle.com/XSL/Transform/java/oracle.tip.xref.xpath.XRefXPathFunctions"
xmlns:plt="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:ora="http://schemas.oracle.com/xpath/extension"
xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator"
xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/db/PashaMobileBankingWs/PashaMobileBankingWS/payments_dwh"
xmlns:ldap="http://schemas.oracle.com/xpath/extension/ldap"
exclude-result-prefixes="xsi xsl top plt xsd wsdl tns client plnk xp20 bpws mhdr bpel oraext dvm hwf med ids bpm xdk xref ora socket ldap">
<xsl:template match="/">
<client:processResponse>
<xsl:for-each select="/top:VMbLoanProductsCollection/top:VMbLoanProducts">
<client:LoanProduct>
<client:Id>
<xsl:value-of select="top:id"/>
</client:Id>
<client:Name>
<xsl:value-of select="/top:VMbLoanProductsCollection/top:VMbLoanProducts/top:nameAz"/>
</client:Name>
<client:MaxAmount>
<xsl:value-of select="/top:VMbLoanProductsCollection/top:VMbLoanProducts/top:maxAmount"/>
</client:MaxAmount>
<client:InterestRate>
<xsl:value-of select="/top:VMbLoanProductsCollection/top:VMbLoanProducts/top:interestRate"/>
</client:InterestRate>
<client:MaxPeriod>
<xsl:value-of select="/top:VMbLoanProductsCollection/top:VMbLoanProducts/top:maxPeriod"/>
</client:MaxPeriod>
</client:LoanProduct>
</xsl:for-each>
</client:processResponse>
</xsl:template>
快速回答,因为我是通过手机回复的。从 for-each 循环内的 select 属性中删除 /top:VMbLoanProductsCollection/top:VMbLoanProducts/。
我有一个基本的应用程序,我从数据库中获取贷款产品列表并显示给用户。我写了一个 xsl 转换文件,我在其中迭代结果集并将每一行添加为贷款产品。但是最后的List里面填满了同样的对象。
我的composite.xml:
GetLoanProductsBPEL 内容:
和 GetLoanProductsBPEL 组件内的 Transform1 文件内容:
在数据库中我有 3 个贷款产品:
但结果我得到了相同贷款产品的 3 个实例:
<env:Body>
<inp1:GetLoanProductsResponse xmlns:inp1="http://xmlns.oracle.com/singleString">
<inp1:LoanProduct>
<inp1:Id>1</inp1:Id>
<inp1:Name>Cash loan</inp1:Name>
<inp1:MaxAmount>100000</inp1:MaxAmount>
<inp1:InterestRate>12</inp1:InterestRate>
<inp1:MaxPeriod>60</inp1:MaxPeriod>
</inp1:LoanProduct>
<inp1:LoanProduct>
<inp1:Id>1</inp1:Id>
<inp1:Name>Cash loan</inp1:Name>
<inp1:MaxAmount>100000</inp1:MaxAmount>
<inp1:InterestRate>12</inp1:InterestRate>
<inp1:MaxPeriod>60</inp1:MaxPeriod>
</inp1:LoanProduct>
<inp1:LoanProduct>
<inp1:Id>1</inp1:Id>
<inp1:Name>Cash loan</inp1:Name>
<inp1:MaxAmount>100000</inp1:MaxAmount>
<inp1:InterestRate>12</inp1:InterestRate>
<inp1:MaxPeriod>60</inp1:MaxPeriod>
</inp1:LoanProduct>
</inp1:GetLoanProductsResponse>
</env:Body>
当我查看 Flow Trace 时,我发现在 Invoke 中我得到了 3 条不同的记录,但在 Transform1 之后,相同的记录被写入了 3 次。
调用 1 跟踪:
转换后的回复输出:
Transform1 XSLT 文件源代码:
<?xml version="1.0" encoding="UTF-8" ?>
<?oracle-xsl-mapper
<!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. -->
<mapSources>
<source type="WSDL">
<schema location="../payments_dwh.wsdl"/>
<rootElement name="VMbLoanProductsCollection" namespace="http://xmlns.oracle.com/pcbpel/adapter/db/top/payments_dwh"/>
</source>
</mapSources>
<mapTargets>
<target type="WSDL">
<schema location="../GetLoanProductsBPEL.wsdl"/>
<rootElement name="processResponse" namespace="http://xmlns.oracle.com/PashaMobileBankingWs/PashaMobileBankingWS/GetLoanProductsBPEL"/>
</target>
</mapTargets>
<!-- GENERATED BY ORACLE XSL MAPPER 11.1.1.7.0(build 130301.0647.0008) AT [WED OCT 19 17:41:51 AZST 2016]. -->
?>
<xsl:stylesheet version="1.0"
xmlns:client="http://xmlns.oracle.com/PashaMobileBankingWs/PashaMobileBankingWS/GetLoanProductsBPEL"
xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20"
xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:top="http://xmlns.oracle.com/pcbpel/adapter/db/top/payments_dwh"
xmlns:mhdr="http://www.oracle.com/XSL/Transform/java/oracle.tip.mediator.service.common.functions.MediatorExtnFunction"
xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
xmlns:oraext="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dvm="http://www.oracle.com/XSL/Transform/java/oracle.tip.dvm.LookupValue"
xmlns:hwf="http://xmlns.oracle.com/bpel/workflow/xpath"
xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:med="http://schemas.oracle.com/mediator/xpath"
xmlns:ids="http://xmlns.oracle.com/bpel/services/IdentityService/xpath"
xmlns:bpm="http://xmlns.oracle.com/bpmn20/extensions"
xmlns:xdk="http://schemas.oracle.com/bpel/extension/xpath/function/xdk"
xmlns:xref="http://www.oracle.com/XSL/Transform/java/oracle.tip.xref.xpath.XRefXPathFunctions"
xmlns:plt="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:ora="http://schemas.oracle.com/xpath/extension"
xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator"
xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/db/PashaMobileBankingWs/PashaMobileBankingWS/payments_dwh"
xmlns:ldap="http://schemas.oracle.com/xpath/extension/ldap"
exclude-result-prefixes="xsi xsl top plt xsd wsdl tns client plnk xp20 bpws mhdr bpel oraext dvm hwf med ids bpm xdk xref ora socket ldap">
<xsl:template match="/">
<client:processResponse>
<xsl:for-each select="/top:VMbLoanProductsCollection/top:VMbLoanProducts">
<client:LoanProduct>
<client:Id>
<xsl:value-of select="top:id"/>
</client:Id>
<client:Name>
<xsl:value-of select="/top:VMbLoanProductsCollection/top:VMbLoanProducts/top:nameAz"/>
</client:Name>
<client:MaxAmount>
<xsl:value-of select="/top:VMbLoanProductsCollection/top:VMbLoanProducts/top:maxAmount"/>
</client:MaxAmount>
<client:InterestRate>
<xsl:value-of select="/top:VMbLoanProductsCollection/top:VMbLoanProducts/top:interestRate"/>
</client:InterestRate>
<client:MaxPeriod>
<xsl:value-of select="/top:VMbLoanProductsCollection/top:VMbLoanProducts/top:maxPeriod"/>
</client:MaxPeriod>
</client:LoanProduct>
</xsl:for-each>
</client:processResponse>
</xsl:template>
快速回答,因为我是通过手机回复的。从 for-each 循环内的 select 属性中删除 /top:VMbLoanProductsCollection/top:VMbLoanProducts/。