XSLT如何提取子元素下全部嵌套子元素内容并渲染到表格
解决方法
错误根因
- XPath路径错误:
<xsl:for-each select="VisitedCountries/Country">执行时,循环内部的上下文已经是单个<Country>节点,你写的select="Country"是查找当前节点下的子<Country>节点,该节点不存在,因此无法正常获取多个国家的值。 - 缺少分隔逻辑:即使成功取值,多个国家名称会直接拼接,无法区分。
- 字段不匹配:你提供的XML示例中没有
InsuranceID、Phone节点,这两列运行后会显示为空,可根据你的完整XML结构调整对应字段。
修复代码
你使用的是XSLT 2.0,推荐直接用value-of的separator属性实现,不需要写循环,代码更简洁:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml"> <xsl:output method="xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/> <xsl:template match="/"> <html> <head></head> <body> <table border="1"> <!-- 加border方便查看效果,不需要可删除 --> <xsl:for-each select="CarOwnerships/Cars/Car"> <tr> <td><xsl:value-of select="ProductionD"/></td> <td> <!-- 额外补充了货币符号显示,不需要可删除 --> <xsl:value-of select="MarketValue/@currency"/> <xsl:value-of select="MarketValue"/> </td> <td> <!-- 直接获取所有国家,用逗号分隔,同时清理节点前后多余空白 --> <xsl:value-of select="VisitedCountries/Country/normalize-space(.)" separator=", "/> </td> <td><xsl:value-of select="InspectionDates/normalize-space(.)"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
如果需要兼容XSLT 1.0,就把国家列的代码替换为循环写法即可:
<td> <xsl:for-each select="VisitedCountries/Country"> <xsl:value-of select="normalize-space(.)"/> <xsl:if test="position() != last()"> <xsl:text>, </xsl:text> </xsl:if> </xsl:for-each> </td>
内容的提问来源于stack exchange,提问作者czarniecki
相关产品推荐
相关产品推荐

