我想使用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标签吗?
答案 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>
编辑:根相对路径的示例,实际相对路径。