递归实现XSLT转换:XML转HTML嵌套列表问题求助
解决XML嵌套回复转HTML层级列表的XSLT问题
你的核心问题是没有为子节点包裹<ul>容器,导致层级结构无法生成。修改后的XSLT代码如下:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <xsl:template match="items"> <html> <ul> <xsl:apply-templates select="item[@par_no=0]"/> </ul> </html> </xsl:template> <xsl:template match="item"> <xsl:variable name="varNo" select="@no"/> <li> <b><xsl:value-of select="@user"/></b> <xsl:text> says: </xsl:text> <xsl:value-of select="."/> <!-- 检查当前item是否有子节点 --> <xsl:if test="//items/item[@par_no=$varNo]"> <ul> <!-- 对所有子节点应用模板并排序 --> <xsl:apply-templates select="//items/item[@par_no=$varNo]"> <xsl:sort select="@no" data-type="number"/> </xsl:apply-templates> </ul> </xsl:if> </li> </xsl:template> </xsl:stylesheet>
关键改动说明:
- 添加子节点容器判断:在当前
<li>内部,通过<xsl:if>检查是否存在以当前item的@no为父节点的子item,存在则输出<ul>包裹子节点 - 调整子节点应用位置:将子节点的
<xsl:apply-templates>放到当前<li>内部,确保子列表是当前列表项的子元素,而非平级元素 - 修正排序字段:原代码按
@par_no排序无实际意义,改为按@no排序,保证子节点按编号顺序展示 - 开启输出缩进:在
<xsl:output>添加indent="yes",让生成的HTML结构更易读
转换后生成的HTML结构与你期望的完全一致,层级嵌套关系正确。
内容的提问来源于stack exchange,提问作者MagicWorld
相关产品推荐
相关产品推荐

