使用XSLT替换html的锚标签中的href值

时间:2010-09-29 18:18:45

标签: xslt

我想使用XSLT替换HTML中的href标记的值。例如:如果锚标记为<a href="/dir/file1.htm" />,我想替换href值,如下所示:<a href="http://site/dir/file1.htm" />。关键是我想用绝对值替换所有相对URL。

我想对HTML内容中的所有锚标记执行此操作。我怎么能用XSLT做到这一点?

感谢。

编辑:这适用于Google Appliance。我在框架中显示结果,并且链接在缓存页面中不起作用。它将地址栏URL作为根。这里的HTML是字符串形式,它根据条件显示HTML。有人可以建议一种方法来替换字符串中的所有href标签吗?

2 个答案:

答案 0 :(得分:1)

此XSLT 1.0转换

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pServerName" select="'http://MyServer'"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="a/@href[not(starts-with(.,'http://'))]">
  <xsl:attribute name="href">
   <xsl:value-of select="concat($pServerName, .)"/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档

<html>
 <a href="/dir/file1.htm">Link 1</a>
 <a href="/dir/file2.htm">Link 2</a>
 <a href="/dir/file3.htm">Link 3</a>
</html>

生成想要的正确结果

<html>
    <a href="http://MyServer/dir/file1.htm">Link 1</a>
    <a href="http://MyServer/dir/file2.htm">Link 2</a>
    <a href="http://MyServer/dir/file3.htm">Link 3</a>
</html>

<强> II。 XSLT 2.0解决方案:

在XPath 2.0中,可以使用标准函数 resolve-uri()

此转化

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">

 <xsl:variable name="vBaseUri" select="'http://Myserver/ttt/x.xsl'"/>

 <xsl:template match="/">
  <xsl:value-of select="resolve-uri('/mysite.aspx', $vBaseUri)"/>
 </xsl:template>
</xsl:stylesheet>

应用于任何XML文档(未使用)时,会生成所需的正确结果

http://Myserver/mysite.aspx

如果样式表模块来自与要解析的相对URL相同的服务器,则无需在参数中传递基础uri - 执行以下操作会生成所需结果:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">

 <xsl:variable name="vBaseUri">
  <xsl:for-each select="document('')">
   <xsl:sequence select="resolve-uri('')"/>
  </xsl:for-each>
 </xsl:variable>


 <xsl:template match="/">
  <xsl:value-of select="resolve-uri('/mysite.aspx', $vBaseUri)"/>
 </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="pDirectoryPath" select="'http://site.org/dir'"/>
    <xsl:variable name="vSitePath" select="concat(
                                            substring-before(
                                                   $pDirectoryPath,
                                                   '//'),
                                            '//',
                                            substring-before(
                                                 substring-after(
                                                       $pDirectoryPath,
                                                       '//'),
                                                 '/'))"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="a/@href[starts-with(.,'/')]" priority="1">
        <xsl:attribute name="href">
            <xsl:value-of select="concat($vSitePath,.)"/>
        </xsl:attribute>
    </xsl:template>
    <xsl:template match="a/@href[not(contains(.,'://'))]">
        <xsl:attribute name="href">
            <xsl:value-of select="concat($pDirectoryPath,'/',.)"/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

使用此输入:

<html>
    <body>
        <h4>Headline</h4>
        <p>Root relative link <a href="/image/image1.jpg" /></p>
        <p>Relative link <a href="next.htm" /></p>
        <p>Absolute Link <a href="http://site.org/dir/file1.htm" /></p>
    </body>
</html>

输出:

<html>
    <body>
       <h4>Headline</h4>
       <p>Root relative link <a href="http://site.org/image/image1.jpg"></a></p>
       <p>Relative link <a href="http://site.org/dir/next.htm"></a></p>
       <p>Absolute Link <a href="http://site.org/dir/file1.htm"></a></p>
    </body>
</html>

编辑:根相对路径的示例,实际相对路径。