Si tienes algún ejemplo de código que estés usando, nos ayudaría si lo publicaras, aun cuando no funcione del todo bien, para poder construir en base a esa guía.
También sería importante saber qué versión de PHP tienes y qué extensiones XML tiene habilitadas tu instalación de PHP ya que hay más de una extensión en PHP para el uso de XPath. Principalmente en PHP4 está
DomXml, y en PHP5
Dom, que son parecidas, pero incompatibles.
Mientras tanto, aquí tienes un ejemplo de cómo extraer datos desde el XML que has publicado, usando la extensión Dom de PHP5:
Código PHP:
<?php
$doc = new DOMDocument;
$doc->Load ('coordenadas.xml');
$xpath = new DOMXpath ($doc);
/*
* Alternativa 1
* -------------
* Obtener una lista de elementos con una expresión xpath, y luego obtener
* información asociada (en este caso los atributos 'x' y 'y' del padre)
* usando expresiones xpath relativas
*/
// Expresión xpath para obtener todas las ciudades, en español
$consulta_ciudades = 'ciudad/es_ES';
// Expresiones xpath para obtener las coordenadas de una ciudad
// (relativas al nodo de una ciudad)
$consulta_x = '../@x';
$consulta_y = '../@y';
$ciudades = $xpath->query ($consulta_ciudades);
echo "Ciudades:\n";
foreach ($ciudades as $ciudad) {
$nombre = $ciudad->nodeValue;
echo "$nombre\n";
$res_x = $xpath->query ($consulta_x, $ciudad);
$res_y = $xpath->query ($consulta_y, $ciudad);
if ($res_x->length > 0 && $res_y->length > 0) {
echo " Coordenadas: ";
echo $res_x->item (0)->nodeValue;
echo '-';
echo $res_y->item (0)->nodeValue;
echo "\n";
}
}
/*
* Alternativa 2
* -------------
* Obtener solo la lista inicial de elementos con una expresión xpath, y
* luego obtener toda la información relacionada mediante manipulación DOM
*/
$consulta_ciudades = '//ciudad';
$ciudades = $xpath->query ($consulta_ciudades);
echo "Ciudades:\n";
foreach ($ciudades as $ciudad) {
$nombre = '';
for ($nodo = $ciudad->firstChild; $nodo !== NULL;
$nodo = $nodo->nextSibling) {
if ($nodo->nodeName == 'es_ES') {
$nombre = $nodo->nodeValue;
}
}
echo "$nombre\n";
$id = 0;
$x = 0;
$y = 0;
foreach ($ciudad->attributes as $atributo) {
if ($atributo->nodeName == 'id')
$id = $atributo->nodeValue;
else if ($atributo->nodeName == 'x')
$x = $atributo->nodeValue;
else if ($atributo->nodeName == 'y')
$y = $atributo->nodeValue;
}
if ($id != 0)
echo " ID: $id\n";
if ($x != 0 && $y != 0)
echo " Coordenadas: $x - $y\n";
}
?>
Si necesitas algo más concreto o algo en particular no te queda claro, cuéntanos y vemos cómo hacerlo más claro :).