¿Hay una mejor manera de obtener el nodo primario del resultado de la consulta XPath?

Tener un marcado como este:

<div class="foo">
   <div><span class="a1"></span><a href="...">...</a></div>
   <div><span class="a2"></span><a href="...">...</a></div>
   <div><span class="a1"></span>some text</div>
   <div><span class="a3"></span>some text</div>
</div>

Estoy interesado en conseguir todo<a> ysome text SOLAMENTE si es adyacentespan es de clasea1. Así que al final de todo el código mi resultado debería ser<a> desde el primerdiv ysome text desde el tercero. Seria facil si<a> ysome text estaban dentrospan odiv tendríaclass Atributo, pero sin suerte.

Lo que estoy haciendo ahora es buscarspan cona1 clase:

//div[contains(@class,'foo')]/div/span[contains(@class,'a1')]

Entonces consigo su padre y hago otra.query() con ese padre como nodo de contexto. Esto simplemente parece estar lejos de ser eficiente, por lo que la pregunta es si existe una mejor manera de lograr mi objetivo.

LA ADENDA A LA RESPUESTA

Según @MarcBrespuesta aceptada, la consulta correcta a usar es:

//div[contains(@class,'foo')]/div/span[contains(@class,'a1')]/..

pero para<a> puede ser mejor usar:

//div[contains(@class,'foo')]/div/span[contains(@class,'a1')]/../a

el obtener el<a> en lugar de su contenedor.

Respuestas a la pregunta(2)

Su respuesta a la pregunta