In XPath, the namespace of an element is part of its name. Not knowing the namespace is like not knowing the local name. There are still ways of finding elements without knowing their names, for example you can use //*[local-name()='xyz'], but you're very much working in the dark.
What you don't need to know is the namespace prefix. It's the namespace URI that matters; your XPath expression should be independent of the prefix used in the source document, which users can choose at will.
Saxon does allow you to construct a NamespaceContext object from a node in the source document (for example, the document element). Specifically, you can do
NamespaceResolver nr = new NamespaceResolver(node);
NamespaceContext nc = new NamespaceContextImpl(nr);
and if you pass this NamespaceContext to the xpath engine, your XPath expression can then use all the namespace bindings that are in scope for that node. However, this is specific to the Saxon implementation of the JAXP XPath API. The reason for this feature is primarily because it allows XPath expressions to be used (like XPointers) as hyperlinks within a document. It's not a good idea to write application code that depends on knowing the prefixes used in the source document but not knowing the URIs - that's not the way namespaces are intended to be used.
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference