我想仅在 xpath 表达式找到匹配项时才使用“bpws:getVariableData()”来分配值。如果没有,什么都不应该发生。不幸的是,如果 xpath 表达式找不到匹配项,则 bpel 处理会因错误而停止。有没有办法实现这种行为?
谢谢你的帮助。
我发现 oracle BPEL 引擎提供了一个功能来忽略数据中的缺失。可以将此标志添加到复制元素,如下所示:
<copy bpelx:ignoreMissingFromData="yes|no"/>
有关如何在 JDeveloper 中设置它的更多信息:http: //download.oracle.com/docs/cd/E17904_01/integration.1111/e10224/bp_manipdoc.htm#SOASE87087
这解决了抛出的错误消息的问题。但是它仍然没有显示出想要的行为。我的意图是,如果无法评估 xpath 表达式,则不进行任何分配。但是,使用 bpelx:ignoreMissingFromData 标志会将空字符串“”分配给目标。
在我的用例中,我想合并两个 XML 文档。只有当元素出现在 document2 中时,我才想为 document1 中的元素分配一个新值。如果不是,请保持 document1 中的元素不变。
我使用转换而不是 BPEL 分配解决了这个问题。在 xsl 中,我使用以下语句。转换获取两个 XML 文档作为输入。Document1 通过参数 $parameter_referenceDocument1 引用。
<elementName>
<xsl:if test="xpathInDocument2">
<xsl:value-of select="xpathInDocument2"/>
</xsl:if>
<xsl:if test="not(xpathInDocument2)">
<xsl:value-of select="$parameter_referenceDocument1.xpathInDocument1"/>
</xsl:if>
</elementName>
我知道它很丑,但可以解决问题。如果有人有更好的解决方案,请告诉我。
不,BPEL 标准要求引擎在这种情况下抛出 selectionFailure。为避免这种情况,请确保您已正确初始化变量和/或针对模式验证变量。您也可以使用 if/switch 活动保护分配活动,以在访问元素之前检查元素的存在。您还可以考虑编写一个自定义 XPath 函数,该函数返回一个默认值,以防变量中不存在所需的元素。但是,我不确定 Oracle BPEL 引擎是否支持这一点。
您可以围绕分配活动创建一个范围,并在范围上使用异常处理程序捕获 selectionFailure,然后将继续处理该项目。
如果需要,您可以在异常处理程序中分配默认值。
为了澄清 Vanto 的说法,Oracle BPEL 引擎确实支持自定义 XPath 函数,您可以这样做。