2012-06-13 13 views
6

Sto cercando di ottenere tutto il testo in un nodo per un set successivo e restituire come un valore (non più nodi).XPath per ottenere tutto il testo nell'elemento come un valore, eliminando le interruzioni di riga

<p> 
    "I love eating out." 
    <br> 
    <br> 
    "This is my favorite restaurant." 
    <br> 
    "I will definitely be back" 
</p> 

Sto usando '/ p' e ottengo tutti i risultati ma ritorna con interruzioni di riga. Anche provare '/ p/text()' comporta ottenere ogni testo tra ogni tag come un valore restituito separato. Il ritorno ideale sarebbe -

"I love eating out. This is my favorite restaurant. I will definitely be back" 

Ho provato a cercare altre domande ma non ho trovato nulla di simile. Si prega di notare che nell'ambiente corrente mi sono limitato a utilizzare solo una query XPath e non posso analizzare o impostare alcun pre-analisi HTML. In particolare sto utilizzando la funzione importXML all'interno di Google Documenti.

+0

Basta selezionare il testo di tutti i discendenti di ' p' con '/ p // */text()'. Accedi al contenuto del nodo di testo con 'textContent'. Avrai ancora bisogno di concatenarli insieme. – nhahtdh

risposta

7

Uso:

normalize-space(/) 

Quando questa espressione XPath viene valutata, il valore di stringa del nodo di documenti (/) viene dapprima prodotto e questo è fornito come argomento della funzione XPath norma normalize-space().

Per definizione, normalize-space() restituisce il suo argomento con i caratteri di spaziatura iniziali e finali eliminati e qualsiasi gruppo temporaneo di caratteri spazi bianchi adiacenti, sostituito da un carattere di spazio singolo.

La valutazione dei suddetti risultati delle espressioni XPath in: "Mi piace mangiare fuori"

"Questo è il mio ristorante preferito." "Io sicuramente"

Per eliminare le virgolette, utilizziamo inoltre la funzione translate():

normalize-space(translate(/,'&quot;', '')) 

Il risultato della valutazione di questa espressione è:

I love eating out. This is my favorite restaurant. I will definitely be back 

Infine, per avere questo risultato racchiuso tra virgolette, usiamo la funzione concat() :

concat('&quot;', 
     normalize-space(translate(/,'&quot;', '')), 
     '&quot;' 
     ) 

La valutazione di questa espressione XPath produce esattamente il risultato voluto:

"I love eating out. This is my favorite restaurant. I will definitely be back" 

XSLT - basata verifica:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "concat('&quot;', 
      normalize-space(translate(/,'&quot;', '')), 
      '&quot;' 
      )"/> 
</xsl:template> 
</xsl:stylesheet> 

Quando questa trasformazione viene applicata sulla il documento XML fornito (corretto Ed a essere reso ben formato):

espressione
<p> 
     "I love eating out." 
     <br /> 
     <br /> 
     "This is my favorite restaurant." 
     <br /> 
     "I will definitely be back" 
</p> 

il XPath viene valutata e il risultato di questa valutazione viene copiato l'output:

"I love eating out. This is my favorite restaurant. I will definitely be back" 
+1

Incredibile risposta. Funziona bene, ma mi chiedo solo se lo spazio di normalizzazione funziona quando si guardano più bambini ... Quando usavo lo spazio di normalizzazione rispetto a set di dati simili su una pagina, invece di restituire più valori singoli, era solo un singolo valore restituito per l'intero pagina (anche se c'erano più bambini con dati simili che stavo cercando di estrarre). Il mio obiettivo è valutare più aree simili nella pagina e restituire ognuna come un singolo valore. –

+0

@RichardOrtega: ciò non è possibile come espressione * single * XPath 1.0 (con XPath 2.0 è possibile scrivere una singola espressione per produrre una sequenza contenente esattamente le stringhe desiderate). Quindi, con XPath 1.0 dovrai selezionare i nodi di testo uno per uno ed elaborare ciascun nodo selezionato nel linguaggio di programmazione che ospita XPath. Se sei interessato a una soluzione XSLT, fai una nuova domanda e fammi sapere :) –

+0

grazie mille, sei stato di grande aiuto! Molto istruttivo, è stata una delle mie prime volte con XPath. –

Problemi correlati