2011-04-04 30 views
17

duplicados posibles:
PHP SimpleXML. How to get the last item?
XSLT Select all nodes containing a specific substringPHP XPath seleccionar último elemento coincidente

que necesita para encontrar el contenido del último elemento span con una clase de 'myClass'. He intentado varias combinaciones pero no puedo encontrar la respuesta.

//span[@class='myPrice' and position()=last()] 

Esto devuelve todos los elementos con '' myClass clase, supongo que esto es debido a que cada elemento que se encuentra es el último en el momento de procesamiento - pero sólo necesito el último elemento real de juego.

+0

entrada xml por favor – Gordon

+0

@fabrik: Creo que no. Esto sería más apropiado: http://stackoverflow.com/questions/4672997/xslt-select-all-nodes-containing-a-specific-substring. No es el último sino el primero y no tiene la etiqueta 'php' ... –

Respuesta

40

Debe marcar para el procesador que desea tratar //span[@class='myPrice'] como el conjunto actual y luego aplicar la posición del predicado() = last() a ese conjunto.

(//span[@class='myPrice'])[last()] 

e.g.

<?php 
$doc = getDoc(); 
$xpath = new DOMXPath($doc); 
foreach($xpath->query("(//span[@class='myPrice'])[last()]") as $n) { 
    echo $n->nodeValue, "\n"; 
} 


function getDoc() { 
    $doc = new DOMDOcument; 
    $doc->loadxml(<<< eox 
<foo> 
    <span class="myPrice">1</span> 
    <span class="yourPrice">0</span> 
    <bar> 
    <span class="myPrice">4</span> 
    <span class="yourPrice">99</span> 
    </bar> 
    <bar> 
    <span class="myPrice">9</span> 
    </bar> 
</foo> 
eox 
); 
    return $doc; 
} 
+0

¿Cómo excluyo la última fila? de hecho, quiero excluir las dos últimas filas del conjunto de resultados. ¿Es posible con una expresión 'xpath'? –

7

La expresión que utilizó medios "seleccionar cada elemento span siempre que (a) tiene @class='myprice', y (b) es el último hijo de su padre Hay dos errores:.

(1) es necesario aplicar el filtro después de la filtración por [position()=last()] @class, en lugar de aplicarlo a todos los elementos span

(2) una expresión de la forma //span[last()] significa /descendant-or-self::*/(child::span[last()]) que selecciona el último lapso de niño de cada elemento. es necesario use paréntesis para cambiar la precedencia: (//span)[last()].

Por lo que la expresión se convierte en (//span[@class='myPrice'])[last()] según lo dado por VolkerK.

Cuestiones relacionadas