Allow me to illustrate with an example. Lets say you are working with this simplified XML document:
<Account>
<Owner>
<ContactInfo>
<Name>Tom Jones</Name>
...
</ContactInfo>
...
</Owner>
<Cosigner>
<ContactInfo>
<Name>Jim Johnson</Name>
...
</ContactInfo>
...
</Cosigner>
</Account>
Dom4j makes it easy to find the Cosigner node:
Node cosignerNode = document.selectSingleNode("/Account/Cosigner");
and at first glance, I thought the following code snippet would return the Cosigner's name:
cosignerNode.selectSingleNode("//ContactInfo/Name") => "Tom Jones"
Counter intuitively, this code returns 'Tom Jones'. This is because when you start an XPath query with '/' or '//', Dom4j will traverse the DOM back up to the root node to begin its search. By removing the leading slashes, it works as expected:
cosignerNode.selectSingleNode("ContactInfo/Name") => "Jim Johnson"
So in conclusion, be careful whenever you use selectSingleNode; make sure that you understand that whenever you use // relative XPath queries, the result will come from the root of the entire document, and will not be limited to children of the node on which you invoke it.