我需要遍历java embed活动中的数组(输入到BPEL),并且需要生成BPEL流程的响应(输出变量)。
我正在使用Jdeveloper和SOA 11g
以下是我的xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/BPELInpuandOutPutArray_jws/Project1/BPEL_input_output_array" xmlns="http://www.w3.org/2001/XMLSchema">
<element name="process">
<complexType>
<sequence>
<element name="simpleinput" type="string"/>
<element name="arrayofObjects" maxOccurs="unbounded" nillable="true">
<complexType>
<sequence>
<element name="input1" type="string"/>
<element name="input2" type="string"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
<element name="processResponse">
<complexType>
<sequence>
<element name="arrayofObjectsoutput" maxOccurs="unbounded" nillable="true">
<complexType>
<sequence>
<element name="output1" type="string"/>
<element name="output2" type="string"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
到目前为止,我能够管理输入数组中的遍历
oracle.xml.parser.v2.XMLElement e1=
(oracle.xml.parser.v2.XMLElement)getVariableData("inputVariable","payload","/client:process/client:arrayofObjects[1]/client:input1");
System.out.println(e1.getFirstChild().getNodeValue());
但我的业务要求是基于某些逻辑设置输出数组中的值。 为此,我使用了以下示例代码。
for(int i=1; i < 4 ;i++)
{
setVariableData("outputVariable","payload","/client:processResponse/client:arrayofObjectsoutput['i']/client:output1",i);
setVariableData("outputVariable","payload","/client:processResponse/client:arrayofObjectsoutput['i']/client:output2",i);
}
我的感觉是数组将被创建为长度3,值将是settes(1,1)(2,2)(3,3),但输出值仅为(3,3)。 请告诉我如何实现同样的目标。
示例代码将不胜感激。
答案 0 :(得分:1)
如果专有扩展不起作用,您可以尝试使用标准BPEL方法并使用XSLT脚本迭代构建结果文档。
BPEL 2.0 specification, pp 65中给出了一个示例,查找迭代文档构造。
基本上,要添加的列表和元素(通过doXSLTransform XPath函数)传递给XSLT脚本,该脚本复制要添加到列表中的元素并返回新文档。然后将其分配给变量。
答案 1 :(得分:1)
我为类似情况做的方法是使用转换来创建第一个元素,然后使用bpelx:insertAfter
插入其他数组元素然后设置它们。
<assign name="Assign_2">
<bpelx:insertAfter>
<bpelx:from variable="outputVariable" part="payload"
query="/client:ArrayManipulationProcessResponse/client:arrayofObjectsoutput"/>
<bpelx:to variable="outputVariable" part="payload"
query="/client:ArrayManipulationProcessResponse/client:arrayofObjectsoutput"/>
</bpelx:insertAfter>
<copy>
<from expression="'MyOutput1-Index2'"/>
<to variable="outputVariable" part="payload"
query="/client:ArrayManipulationProcessResponse/client:arrayofObjectsoutput[2]/client:output1"/>
</copy>
<copy>
<from expression="'MyOutput2-Index2'"/>
<to variable="outputVariable" part="payload"
query="/client:ArrayManipulationProcessResponse/client:arrayofObjectsoutput[2]/client:output2"/>
</copy>
</assign>
答案 2 :(得分:0)
我觉得没有必要为这么简单的任务编写自定义Java代码。以下代码(BPEL2.0)负责复制值。
<assign name="Copy values">
<extensionAssignOperation>
<bpelx:copyList>
<bpelx:from>$inputVariable.payload/ns1:arrayofObjects</bpelx:from>
<bpelx:to>$outputVariable.payload/ns1:arrayofObjectsoutput</bpelx:to>
</bpelx:copyList>
</extensionAssignOperation>
</assign>