在XSLT转换XML数据的过程中,生成对应HTML链接是常见需求,核心是通过XSLT的模板匹配和节点取值语法,结合HTML的<a>标签完成链接构建。下面通过实际代码示例讲解具体实现方法。

XSLT添加链接的基础实现
最基础的场景是给固定的文本内容添加固定地址的链接,只需要直接在XSLT模板中输出<a>标签,同时填充对应的href属性和显示文本即可。
首先准备一份简单的XML源文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<article>
<title>XSLT技术入门</title>
<link>https://ipipp.com/xslt-guide</link>
</article>
对应的XSLT样式表代码如下,实现将XML中的内容转换为带链接的HTML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/article">
<html>
<body>
<h3>
<a href="{link}">
<xsl:value-of select="title"/>
</a>
</h3>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
这里使用了XSLT的属性值模板语法,用花括号包裹link节点的内容,直接将节点值作为<a>标签的href属性值,实现动态绑定链接地址。
动态生成不同地址的链接
如果需要根据XML中的不同节点值生成不同的链接,可以结合<xsl:choose>条件判断语法实现。比如下面的XML中包含了不同分类的内容,需要跳转到不同的分类页面:
<?xml version="1.0" encoding="UTF-8"?>
<items>
<item>
<name>XSLT基础教程</name>
<category>course</category>
<id>101</id>
</item>
<item>
<name>XSLT常见问题</name>
<category>qa</category>
<id>202</id>
</item>
</items>
对应的XSLT实现代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/items">
<html>
<body>
<ul>
<xsl:for-each select="item">
<li>
<xsl:variable name="page_url">
<xsl:choose>
<xsl:when test="category='course'">https://ipipp.com/course/</xsl:when>
<xsl:when test="category='qa'">https://ipipp.com/qa/</xsl:when>
<xsl:otherwise>https://ipipp.com/other/</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="id"/>
</xsl:variable>
<a href="{$page_url}">
<xsl:value-of select="name"/>
</a>
</li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
这里先通过<xsl:variable>定义变量,根据category节点的值拼接不同的基础地址,再拼接id节点的值作为完整的链接地址,最终输出到<a>标签的href属性中。
给XML节点内容添加内链
如果需要给XML中的某个节点内容添加指向当前页面锚点的内链,实现页面内跳转,也可以通过XSLT直接生成对应的锚点链接。示例XML如下:
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<section id="intro">
<title>介绍</title>
<content>XSLT是用于转换XML文档的语言</content>
</section>
<section id="usage">
<title>使用方法</title>
<content>需要配合XML解析器使用</content>
</section>
<nav>
<link_target>intro</link_target>
<link_target>usage</link_target>
</nav>
</doc>
对应的XSLT代码生成导航内链:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/doc">
<html>
<body>
<h2>导航</h2>
<ul>
<xsl:for-each select="nav/link_target">
<li>
<a href="#{."}>
<xsl:value-of select="//section[@id=current()]/title"/>
</a>
</li>
</xsl:for-each>
</ul>
<xsl:for-each select="section">
<div id="{@id}">
<h3>
<xsl:value-of select="title"/>
</h3>
<p>
<xsl:value-of select="content"/>
</p>
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
这里通过XPath的@id获取节点的id属性,生成以#开头的锚点链接,同时匹配对应的section标题作为链接显示文本,实现页面内导航功能。
注意事项
- 生成链接时如果地址包含特殊字符,需要确保XML中的内容已经做好了转义处理,避免转换后的HTML出现语法错误。
- 属性值模板的花括号只能用在属性值中,不能直接用在标签内容里,标签内容需要使用
<xsl:value-of>来输出节点值。 - 如果链接地址是相对路径,需要注意转换后的HTML文件的存放位置,避免出现链接找不到资源的问题。