XSL - Cómo seleccionar el código interno de un nodo

html-agility-pack xpath xslt

Pregunta

Tengo el siguiente fragmento de código html:

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

Me gustaría obtener información interna de la primera div. El resultado esperado es:

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

¿Cómo puedo hacer eso? Ex <xsl:value-of select="//div[@class='rsw-pp rsw-pp-widget']/html()" /> Esto no funcionará porque no hay una función html (). ¿Alguien podría ayudarme?

Respuesta aceptada

Uso :

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

Esto selecciona cualquier nodo (elemento, nodo de texto, instrucción de procesamiento o nodo de comentario) que sea un elemento secundario de cualquier elemento seleccionado con la expresión //div[@class='rsw-pp rsw-pp-widget'] .

Verificación XSLT :

Esta transformación:

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

cuando se aplica en el documento XML proporcionado (corregido para que esté bien formado):

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

selecciona y genera exactamente los nodos deseados :

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

Respuesta popular

Como has encontrado, XSLT no tiene un método html() . Su declaración de selección es casi correcta. Si elimina el /html() , habrá seleccionado el elemento <div> y, al utilizar <xsl:value-of> generará todo el contenido del nodo.

Si está utilizando esto en el contexto de HtmlAgilityPacl (como lo ha etiquetado), siga el enfoque de Oded (con una selección ligeramente modificada):

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


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow