Xsl - 如何从名称中包含特殊字符的属性中选择值

时间:2011-05-18 05:38:03

标签: 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>

我想获得g:rating_override的价值。我试着跟随xsl

<Rating>

  <xsl:value-of 
    select="//div[@class='rsw-pp rsw-pp-widget']/div[@class='rsw-stars']/@g:rating_override" />

 </Rating>

它说'System.Xml.Xsl.XsltException:前缀'g'未定义'。你能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

您需要定义“g”命名空间。典型地,这是在stylesheet元素上完成的。

<xsl:stylesheet 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:g=" ... "
     version="1.0">

答案 1 :(得分:1)

如果您使用的是Html Agility Pack嵌入式XSLT工具,那么您将面临两个严格的Html Agility Pack限制(至少使用版本1.3.0.0):

  • 对命名空间的支持有限
  • XPATH实现不支持导航到属性(仅选择)。例如,这个XPATH“// tag1 / tag2 / @ myatt”不起作用。

您可以使用C#代码克服这些限制,但不能轻松使用纯XPATH,因此不能使用XSLT。

在这种情况下,使用Html Agility Pack将HTML转换为XML通常更容易,然后使用标准.NET类的XML上的常规XSLT,而不是使用Html Agility Pack类的HTML上的XSLT。