XSL - Comment choisir innerhtml d'un noeud

html-agility-pack xpath xslt

Question

J'ai l'extrait de code html suivant:

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

Je voudrais obtenir innerhtml de la première div. Le résultat attendu est:

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

Comment puis je faire ça? Ex <xsl:value-of select="//div[@class='rsw-pp rsw-pp-widget']/html()" /> Cela ne fonctionnera pas car il n'y a pas de fonction html () Quelqu'un pourrait-il m'aider?

Réponse acceptée

Utiliser :

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

Ceci sélectionne tout noeud (élément, noeud de texte, instruction de traitement ou commentaire) qui est un enfant de tout élément sélectionné par l'expression //div[@class='rsw-pp rsw-pp-widget'] .

Vérification XSLT :

Cette transformation:

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

lorsqu'il est appliqué sur le document XML fourni (corrigé pour être bien formé):

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

sélectionne et affiche exactement les noeuds recherchés :

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

Réponse populaire

Comme vous l'avez constaté, XSLT n'a pas de méthode html() . Votre déclaration choisie est à peu près juste. Si vous supprimez le /html() vous aurez sélectionné l'élément <div> vous êtes et utilisez <xsl:value-of> pour afficher tout le contenu du nœud.

Si vous l'utilisez dans le contexte de HtmlAgilityPacl (comme vous l'avez étiqueté), suivez l'approche de Oded (avec une sélection légèrement modifiée):

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi