I have wrestled with
these two since 10g . However, I still mix them up when I use them in BPEL 2.0. The function signature of count() has changed since BPEL1.1.
For the record, here
is the scoop on these two functions in BPEL 2.0:
I have created a simple
test BPEL based on the sample schema (at the end of this post).
I tested count() and
countNodes() like below:
#1 count($outputVariable.payload/client:result)
It shows 0. Please note
"result" is optional based on the XSD. Additionally, please note that
if you enter an invalid path, such as “$outputVariable.payload/foo/bar”, JDev
won’t compile it. So count() only allows valid xpath for the variable type, check
#5 of countNodes() below to see more on this.
#2 count($inputVariable.payload/client:input)
It shows 1 as expected.
#3 ora:countNodes('outputVariable',
'payload', '/client:processResponse/client:result')
It shows 0, same as case
#1. However, pay close attention to two things: first argument is the variable
name as a string, not “$variable” as it appears in count(). Additionally, the 3rd
argument uses the full path “/client:processResponse/client:result”. It
includes “client:processResponse” section.
#4 ora:countNodes('inputVariable', 'payload',
'/client:process/client:input')
It shows 1, just like in case #2. However,
pay attention that first argument is the string name of the variable. Second argument
is the “part” of the message type. Third argument needs the full path like “/client:process/client:input”.
In the case of count() function, it appears that it skipped the “root” element “client:process”
after payload.
#5 ora:countNodes('outputVariable',
'payload', '/client:input/test_invalid_path)
Finally, this one shows
0 as expected. The point here is to show that you can enter a path that is not
defined in your XSD. This may come in handy if you have a payload that does not
conform to your input schema, or you simply do not know the schema beforehand.
Here is the schema,
please note that I have made "result" optional:
<?xml version="1.0"
encoding="UTF-8"?>
<schema
attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://xmlns.oracle.com/cis/foo/BPELProcess1"
xmlns="http://www.w3.org/2001/XMLSchema">
<element
name="process">
<complexType>
<sequence>
<element
name="input" type="string" minOccurs="0"/>
</sequence>
</complexType>
</element>
<element
name="processResponse">
<complexType>
<sequence>
<element
name="result" type="string" minOccurs="0"/>
</sequence>
</complexType>
</element>
</schema>
Can u change input as mandatory, as ur schema misleading ur explanation
ReplyDeleteThanks for this blog. It helped me a lot.
ReplyDelete