2012-06-13 4 views
6

Ich versuche, den gesamten Text in einem Knoten für einen folgenden Satz zu erhalten und als einen Wert (nicht mehrere Knoten) zurückzugeben.XPath, um den gesamten Text in einem Element als einen Wert zu erhalten, Zeilenumbrüche werden entfernt

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

Ich benutze '/ p' und bekomme alle Ergebnisse, aber es kommt mit Zeilenumbrüchen zurück. Wenn Sie versuchen, '/ p/text()' einzugeben, wird jeder Text zwischen den einzelnen Tags als separater Rückgabewert abgerufen. Die ideale Rückmeldung wäre -

Ich habe versucht, andere Fragen zu suchen, aber konnte etwas nicht so nah finden. Bitte beachten Sie, dass ich in der aktuellen Umgebung nur eine XPath-Abfrage verwenden kann und keine HTML-Analyse vor dem Parsing durchführen kann. Insbesondere verwende ich die ImportXML-Funktion in Google Text & Tabellen.

+0

Wählen Sie einfach den Text aller Nachkommen von ' p 'mit'/p // */text() '. Greifen Sie mit 'textContent' auf den Inhalt des Textknotens zu. Sie müssen sie immer noch miteinander verketten. – nhahtdh

Antwort

7

Verwenden:

normalize-space(/) 

Wenn dieser XPath-Ausdruck ausgewertet wird, wird der String-Wert des Dokumentenknoten (/) zuerst hergestellt und dies wird als Argument an die Standard-XPath Funktion normalize-space() vorgesehen.

Per Definition normalize-space() liefert dessen Argument mit den führenden und benachbarte Leerzeichen eliminiert und jede Zwischen solche Gruppe von benachbarten Leerzeichen nachlauf - durch ein einzelnes Leerzeichen ersetzt.

Die Auswertung der oben XPath-Ausdruck ergibt: "Ich liebe Essen"

"Das ist mein Lieblingsrestaurant." "Ich werde auf jeden Fall wieder"

die Zitate zu beseitigen, zusätzlich wir die translate() Funktion:

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

Das Ergebnis dieser Ausdruck der Auswertung ist:

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

Schließlich, um dieses Ergebnis in Anführungszeichen eingeschlossen zu haben, verwenden wir die concat() Funktion :

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

Die Auswertung dieses XPath-Ausdruck erzeugt genau das gewünschte Ergebnis:

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

XSLT - basierte Verifikation:

<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> 

Wenn diese Transformation auf angewendet wird das bereitgestellte XML Dokument (korrekt ed gemacht werden wohlgeformt):

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

der XPath-Ausdruck ausgewertet und das Ergebnis dieser Auswertung in die Ausgabe kopiert wird:

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

Erstaunliche Antwort. Das funktioniert gut, aber ich frage mich nur, ob normalize-space funktioniert, wenn ich mehrere Kinder betrachte ... Wenn ich normalize-space mit ähnlichen Datensätzen auf einer Seite nutze, anstatt mehrere einzelne Werte zurückzugeben, wurde nur ein einzelner Wert zurückgegeben Seite (auch wenn es mehrere Kinder mit ähnlichen Daten gab, die ich extrahieren wollte). Mein Ziel ist es, mehrere ähnliche Bereiche auf der Seite auszuwerten und jeden als einen Wert zurückzugeben. –

+0

@RichardOrtega: Dies ist nicht möglich als * einzelner * XPath 1.0-Ausdruck (mit XPath 2.0 ist es möglich, einen einzelnen Ausdruck zu schreiben, um eine Sequenz zu erzeugen, die genau die gewünschten Strings enthält). Mit XPath 1.0 müssen Sie die Textknoten einzeln auswählen und jeden ausgewählten Knoten in der Programmiersprache, die XPath hostet, verarbeiten. Wenn Sie an einer XSLT-Lösung interessiert sind - stellen Sie einfach eine neue Frage und lassen Sie es mich wissen :) –

+0

Vielen Dank, Sie waren eine große Hilfe! Sehr informativ, es war eines meiner ersten Male mit XPath. –

Verwandte Themen