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

问题描述:

我的目的是从谷歌地点获取数据。我有以下代码片段html: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> 

我想获得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' 没有定义'。你可以帮帮我吗?

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

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

如果您是使用HTML敏捷性包嵌入式XSLT工具,你面临两个硬盘的HTML敏捷性包的限制(至少1.3.0.0版本):

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

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

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