XSL — как выбрать innerhtml узла

У меня есть следующий фрагмент 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>

Я хотел бы получить innerhtml первого div. Ожидаемый результат:

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

Как я могу это сделать? Пример <xsl:value-of select="//div[@class='rsw-pp rsw-pp-widget']/html()" /> Это не сработает, потому что нет функции html(). Кто-нибудь может мне помочь?


person Jin Ho    schedule 18.05.2011    source источник
comment
Вы ищете правильное выражение XPath?   -  person Emiliano Poggi    schedule 18.05.2011
comment
Хороший вопрос, +1. См. мой ответ для полного, короткого и простого однострочного решения XPath-выражения. :)   -  person Dimitre Novatchev    schedule 18.05.2011
comment
Является ли это чистым сквозным Xml или HTML, проанализированным Html Agility Pack? У вас есть фрагмент кода, чтобы увидеть, что именно вы используете?   -  person Simon Mourier    schedule 18.05.2011


Ответы (3)


Использование:

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

Это выбирает любой узел (элемент, текстовый узел, инструкцию обработки или узел комментариев), который является дочерним элементом любого элемента, выбранного выражением //div[@class='rsw-pp rsw-pp-widget'].

Подтверждение XSLT:

Это преобразование:

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

при применении к предоставленному XML-документу (исправлено для правильности):

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

выбирает и выводит именно нужные узлы:

    <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 "/>
person Dimitre Novatchev    schedule 18.05.2011

Предполагая, что опубликованный фрагмент является полным документом в переменной doc:

var outerDivNode = doc.DocumentNode.SelectSingleNode("/div");
var innerDivText = outerDivNode.InnerHtml;

В качестве альтернативы:

var innerDivNode = doc.DocumentNode.SelectSingleNode("/div/dev");
var innerDivText = innerDivNode.OuterHtml;
person Oded    schedule 18.05.2011

Как вы уже поняли, в XSLT нет метода html(). Ваш оператор выбора почти прав. Если вы удалите /html(), вы выберете элемент <div>, которым вы являетесь, и использование <xsl:value-of> выведет все содержимое узла.

Если вы используете thsi в контексте HtmlAgilityPacl (как вы его пометили), следуйте подходу Oded (с немного измененным выбором):

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