XSL - So wählen Sie den inneren Schein eines Knotens aus

html-agility-pack xpath xslt

Frage

Ich habe folgendes HTML-Snippet:

<div class="rsw-pp rsw-pp-widget">
  <div g:type="AverageStarRating" g:secondaryurls="http://maps.google.com/?cid=12948004443906002997" g:decorateusingsecondary="http://maps.google.com/?cid=12948004443906002997" g:groups="maps" g:rating_override="2.998000" class="rsw-stars ">   </div>
</div>

Ich würde gerne innerhtml von der ersten div bekommen. Das erwartete Ergebnis ist:

<div g:type="AverageStarRating" g:secondaryurls="http://maps.google.com/?cid=12948004443906002997" g:decorateusingsecondary="http://maps.google.com/?cid=12948004443906002997" g:groups="maps" g:rating_override="2.998000" class="rsw-stars ">     </div>

Wie kann ich das machen? Ex <xsl:value-of select="//div[@class='rsw-pp rsw-pp-widget']/html()" /> Das wird nicht funktionieren, weil es keine html () -Funktion gibt. Könnte mir jemand helfen?

Akzeptierte Antwort

Verwenden :

//div[@class='rsw-pp rsw-pp-widget']/node()

Dadurch wird ein beliebiger Knoten (Element, Textknoten, Verarbeitungsanweisung oder Kommentarknoten) ausgewählt, der ein Kind eines Elements ist, das durch den Ausdruck //div[@class='rsw-pp rsw-pp-widget'] .

XSLT-Verifizierung :

Diese Umwandlung:

<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:copy-of select=
     "//div[@class='rsw-pp rsw-pp-widget']/node()"/>
 </xsl:template>
</xsl:stylesheet>

wenn es auf das bereitgestellte XML-Dokument angewendet wird (korrigiert, um gut gebildet zu werden):

<div class="rsw-pp rsw-pp-widget">
    <div xmlns:g="g:g"
        g:type="AverageStarRating"
        g:secondaryurls="http://maps.google.com/?cid=12948004443906002997"
        g:decorateusingsecondary="http://maps.google.com/?cid=12948004443906002997"
        g:groups="maps" g:rating_override="2.998000" class="rsw-stars "></div>
 </div>

selektiert und gibt genau die gewünschten Knoten aus :

    <div xmlns:g="g:g" g:type="AverageStarRating"
 g:secondaryurls="http://maps.google.com/?cid=12948004443906002997" 
 g:decorateusingsecondary="http://maps.google.com/?cid=12948004443906002997" 
 g:groups="maps" g:rating_override="2.998000" class="rsw-stars "/>

Beliebte Antwort

Wie Sie herausgefunden haben, hat XSLT keine html() -Methode. Ihre Select-Anweisung ist genau richtig. Wenn Sie die /html() entfernen, haben Sie das <div> -Element ausgewählt, das Sie verwenden, und <xsl:value-of> wird den gesamten Inhalt des Knotens ausgeben.

Wenn Sie thsi im Kontext von HtmlAgilityPacl verwenden (wie Sie es getaggt haben), dann folgen Sie Oded's Ansatz (mit einer leicht modifizierten Auswahl):

var outerDivNode = doc.DocumentNode.SelectSingleNode("//div[@class='rsw-pp rsw-pp-widget']");
var innerDivText = outerDivNode.InnerHtml;



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum