J'ai dcompos l'expression XPath en deux parties distinctes :

count($GetContactListOut.parameters/contactList[child::phoneNum[text() = $GetRulesOut.parameters/rule[$index + 1]/conditions/addressBookCondition/listABCondition/contact/name] and child::node()[text() = $GetForkingProfileIn.parameters/callerSipURI]]) > 0
count($GetContactListOut.parameters/contactList[child::phoneNum[text() = $GetRulesOut.parameters/rule[$index + 1]/conditions/addressBookCondition/listABCondition/contact/name]  and child::node()[text() = Frank] ]) > 0

(expression X)
child::phoneNum[text() = $GetRulesOut.parameters/rule[$index + 1]/conditions/addressBookCondition/listABCondition/contact/name] : Frank
    signifie que l'on rcupre tous les noeuds de type phoneNum dont le contenu est gal au contenu de la balise
    rule/addressBookCondition/listABCondition/contact/name...donc on compare des noms  des numros de tlphone

(expression Y)
child::node()[text() = $GetForkingProfileIn.parameters/callerSipURI] :
    signifie que l'on rcupre tous les noeuds contenant le texte contenu dans la balise callerSipURI du message que l'on reoit en entre du process BPEL

count($GetContactListOut.parameters/contactList[X and Y]) > 0 :
    signifie que l'on vrifie que l'on a au moins un noeud de type contactList respectant les conditions X et Y

Les tests effectus sont les suivants :

count(X) = 0     count(Y) = 0     count(X & Y) = 0      name= noughtXnoughtY
count(X) = 0     count(Y) = 1     count(X & Y) = 0      name= noughtXoneY
count(X) = 0     count(Y) = 2     count(X & Y) = 0      name= noughtXtwoY
count(X) = 1     count(Y) = 0     count(X & Y) = 0      name= oneXnoughtY
count(X) = 2     count(Y) = 0     count(X & Y) = 0      name= twoXnoughtY
count(X) = 1     count(Y) = 1     count(X & Y) = 1      name= oneXoneY
count(X) = 2     count(Y) = 2     count(X & Y) = 2      name= twoXtwoY

