2011-05-18 92 views
1

我有以下的HTML代码段的innerHTML:XSL - 如何选择一个节点

<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()函数。任何人都可以帮我吗?

+0

您是否在寻找正确的XPath表达式? – 2011-05-18 11:06:17

+0

好问题,+1。查看我的答案,获得完整,简短且易于使用的XPath表达式解决方案。 :) – 2011-05-18 13:27:18

+0

它是纯粹的端到端Xml或Html解析由Html敏捷包?你有一段代码,看看你在使用什么? – 2011-05-18 14:37:39

回答

0

使用

//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文档施加(校正为简洁(wellformed)):

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

假设张贴片段是在doc变量的完整文档:

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

或者:

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

正如您看到,XSLT不具有html()方法。你的选择陈述是正确的。如果您删除了/html(),您将选择<div>元素,使用<xsl:value-of>将输出节点的所有内容。

如果你在HtmlAgilityPacl的环境中使用thsi(如你标记吧)然后按照俄德的方式(用稍微修改选择):

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