我在从xml / xslt转换中获得以下结果时遇到问题:
<root>
<node>
<id>1</id>
<parentid></parentid>
<name>file 1</name>
<node>
<node>
<id>2</id>
<parentid></parentid>
<name>file 2</name>
<node>
<node>
<id>3</id>
<parentid>2</parentid>
<name>file 3</name>
<node>
<node>
<id>4</id>
<parentid></parentid>
<name>file 4</name>
<node>
<node>
<id>5</id>
<parentid>2</parentid>
<name>file 5</name>
<node>
</root>
我希望输出html类似于:
<ul>
<li>file 1</li>
<li>file 2</li>
<ul>
<li>file 3</li>
<li>file 5</li>
</ul>
<li>file 4</li>
</ul>
答案 0 :(得分:2)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/root">
<ul>
<xsl:apply-templates select="node[string-length(parentid)=0]" />
</ul>
</xsl:template>
<xsl:template match="node">
<li>
<xsl:value-of select="name"/>
</li>
<xsl:variable name="children" select="parent::*/node[parentid=current()/id]" />
<xsl:if test="$children">
<ul>
<xsl:apply-templates select="$children" />
</ul>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:2)
密钥(没有双关语)是使用<xsl:key>
来设置父子关系。一旦定义了,剩下的就很容易了。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:key name="getchildren" match="node" use="parentid"/>
<xsl:template match="root">
<ul>
<xsl:apply-templates
select="node[parentid[not(normalize-space())]]"/>
</ul>
</xsl:template>
<xsl:template match="node">
<li><xsl:value-of select="name"/></li>
<xsl:variable name="children" select="key( 'getchildren', id )"/>
<xsl:if test="$children">
<ul><xsl:apply-templates select="$children"/></ul>
</xsl:if>
</xsl:template>
</xsl:stylesheet>