Utilizando XPath para extraer elementos XOM de documentos con espacios de nombres innecesarios

Estoy intentando analizar algo de HTML devuelto por un sistema externo con XOM. El HTML se ve así:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<body>
  <div>
    Help I am trapped in a fortune cookie factory
  </div>
</body>
</html>

(En realidad, es significativamente más complicado, pero tiene esta declaración DOCTYPE y estas declaraciones de espacio de nombres y lenguaje, y el HTML anterior presenta el mismo problema que el HTML real).

o que quiero hacer es extraer el contenido de la<div>, pero la declaración del espacio de nombres parece confundir XPath. Si elimino la declaración del espacio de nombres (a mano, del archivo), el siguiente código encuentra el<div>, No hay problema

Document document = ...
Nodes divs = document.query("//div");

Pero con el espacio de nombres, el @ devuelNodes tiene un tamaño de 0.

Muy bien, ¿qué tal si elimino el espacio de nombres mediante programación?

Element rootElement = document.getRootElement();
rootElement.removeNamespaceDeclaration(rootElement.getNamespacePrefix());

... parece que debería funcionar, pero no hace nada. Desde el javadoc:

Este método solo elimina espacios de nombres adicionales agregados conaddNamespaceDeclaration.

Bien, pensé, proporcionaré el espacio de nombres para la consulta:

XPathContext context = 
    XPathContext.makeNamespaceContext(document.getRootElement());
Nodes divs = document.query("//div", context);

El tamaño sigue siendo cero.

Qué tal construir el contexto del espacio de nombres a mano?

XPathContext context = context = new XPathContext(
     rootElement.getNamespacePrefix(), rootElement.getNamespaceURI());
Nodes divs = document.query("//div", context);

LosXPathContext el constructor explota con:

nu.xom.NamespaceConflictException: 
    XPath expressions do not use the default namespace

Entonces, estoy buscando:

una forma de hacer que esta consulta funcione, o una forma de eliminar mediante programación las declaraciones de espacio de nombres, ouna explicación del enfoque correcto, suponiendo que ambos estén equivocados.

Actualizar Residencia ena respuesta de @Lev Levitsky y elJaxen Preguntas frecuentes Se me ocurrió el siguiente truco:

XPathContext context = new XPathContext(
    "foo", 
    document.getRootElement().getNamespaceURI());
Nodes divs = document.query("//foo:div");

Esto todavía me parece un poco demente, pero supongo que es la forma en que Jaxen quiere que hagas las cosas.

Actualización # 2: Como se indica a continuación ytodos a través de Internet, esto no es culpa de Jaxen; es solo XPath siendo XPath.

Por lo tanto, aunque este truco funciona, todavía me gustaría una forma de quitar la declaración del espacio de nombres. Preferiblemente sin ir tan lejos como XSLT.

Respuestas a la pregunta(4)

Su respuesta a la pregunta