XSL属性值转义问题求助:如何根据wiki元素生成HTML链接
问题分析与解决方案
你遇到的核心问题是在XSL中直接将<xsl:value-of>嵌入HTML属性值里,这违反了XML的语法规则——XML属性值中不能包含未转义的<字符。除此之外,你的XSL代码里还有一个结构错误:第二个<td>标签被放在了<tr>标签外面,这会导致生成的HTML结构不合法。
修正后的XSL代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <table> <tr> <th>Name</th> <th>Address</th> </tr> <xsl:for-each select="bases/marker"> <xsl:sort select="name" /> <tr> <td> <!-- 使用属性值模板(大括号{})来动态生成href属性 --> <xsl:if test="wiki"> <a href="https://en.wikipedia.com/wiki/{wiki}"> <xsl:value-of select="name"/> </a> </xsl:if> <!-- 当没有wiki元素时,直接输出名称 --> <xsl:if test="not(wiki)"> <xsl:value-of select="name"/> </xsl:if> </td> <td><xsl:value-of select="adr"/>, <xsl:value-of select="state"/></td> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet>
关键修正点说明
属性值模板替代直接嵌入
<xsl:value-of>
在XSLT中,要动态设置HTML属性值,应该使用属性值模板(用{}包裹XPath表达式),比如href="https://en.wikipedia.com/wiki/{wiki}",这样XSL处理器会自动计算wiki节点的值并插入到属性中,避免了XML语法错误。修正HTML结构错误
你原来的代码里把第二个<td>放在了<tr>外面,这会导致生成的HTML表格结构混乱,修正后将其移到<tr>内部,保证每个<tr>包含对应的<td>。优化条件判断逻辑
原来的test="wiki != ''"可以简化为test="wiki"(判断节点是否存在),用not(wiki)判断节点不存在,逻辑更清晰。
生成的正确HTML输出
对于你的XML输入,会生成如下合法的HTML:
<table> <tr> <th>Name</th> <th>Address</th> </tr> <tr> <td><a href="https://en.wikipedia.com/wiki/Link_1">Sample 1</a></td> <td>Boston, Mass</td> </tr> <tr> <td>Sample 2</td> <td>Essex, Vermont</td> </tr> </table>
内容的提问来源于stack exchange,提问作者Ed S.
相关产品推荐
相关产品推荐

