XSL - 如何选择节点的innerhtml

时间:2011-05-18 10:53:18

标签: xslt xpath html-agility-pack

我有以下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>

我想获得第一个div的innerhtml。预期结果是:

<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()函数。有谁可以帮助我?

3 个答案:

答案 0 :(得分:1)

使用

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

答案 1 :(得分:0)

假设发布的片段是doc变量中的完整文档:

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

可替换地:

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

答案 2 :(得分:0)

正如您所发现的,XSLT没有html()方法。你的选择陈述恰到好处。如果您删除了/html(),那么您将选择<div>元素,并使用<xsl:value-of>输出节点的所有内容。

如果您在HtmlAgilityPacl的上下文中使用了thsi(正如您标记的那样),那么请遵循Oded的方法(略微修改选择):

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