2011-05-18 126 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;