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:
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.
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"?>
<element name="input" type="string" minOccurs="0"/>
<element name="result" type="string" minOccurs="0"/>