【问题标题】:XSL - How to select innerhtml of a nodeXSL - 如何选择节点的内部 HTML
【发布时间】:2011-05-18 10:53:17
【问题描述】:

我有以下 html sn-p:

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

我该怎么做?前&lt;xsl:value-of select="//div[@class='rsw-pp rsw-pp-widget']/html()" /&gt; 这不起作用,因为没有 html() 函数。谁能帮帮我?

【问题讨论】:

  • 您在寻找正确的 XPath 表达式吗?
  • 好问题,+1。请参阅我的答案以获得完整、简短且简单的单行 XPath 表达式解决方案。 :)
  • 是纯端到端 Xml 还是 Html Agility Pack 解析的 Html?您是否有一段代码可以查看您到底在使用什么?

标签: xslt xpath html-agility-pack


【解决方案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 "/>

【讨论】:

    【解决方案2】:

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

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

    或者:

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

    【讨论】:

      【解决方案3】:

      如您所见,XSLT 没有html() 方法。您的 select 语句几乎是正确的。如果您删除 /html(),您将选择您正在使用的 &lt;div&gt; 元素,使用 &lt;xsl:value-of&gt; 将输出节点的所有内容。

      如果您在 HtmlAgilityPacl 的上下文中使用 thsi(如您已标记的那样),请遵循 Oded 的方法(稍作修改的选择):

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多