我有输入文件。它是一张有一个col的表:
<table>
<tr><td>0</td></tr>
<tr><td>1</td></tr>
<tr><td>0</td></tr>
<tr><td>3</td></tr>
<tr><td>3</td></tr>
</table>
第一行中的数字是输出文档中<li>
个元素的父项数。这是各种各样的。我需要在ouput文档中生成结构,如下所示:
<li id="0">
<li id="1">
<li id="2"/>
</li>
<li id="3">
<li id="4"/>
<li id="5"/>
</li>
</li>
我是否可以在out-document中添加元素链接以附加孩子?可能是我需要递归算法......
答案 0 :(得分:0)
我认为你可以做的是使用一个键,将tr
元素与第一个具有较低td
值的兄弟姐妹相关联
<xsl:key name="lists" match="tr" use="generate-id(preceding-sibling::tr[td < current()/td][1])" />
要获得顶级元素,您可以这样做......
<xsl:apply-templates select="key('lists', generate-id())" />
当定位在tr
元素上,为了获取子元素,你会这样做......
<xsl:apply-templates select="key('lists', generate-id())" />
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="lists" match="tr" use="generate-id(preceding-sibling::tr[td < current()/td][1])" />
<xsl:template match="/table">
<xsl:apply-templates select="key('lists', '')" />
</xsl:template>
<xsl:template match="tr">
<li id="{td}">
<xsl:apply-templates select="key('lists', generate-id())" />
</li>
</xsl:template>
</xsl:stylesheet>
我不相信<li>
标签应该以这种方式嵌套。它们应该真正包含在<ol>
或<ul>
标记中,以便开始。也许这就是你真正想要的......
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="lists" match="tr" use="generate-id(preceding-sibling::tr[td < current()/td][1])" />
<xsl:template match="/table">
<ul>
<xsl:apply-templates select="key('lists', '')" />
</ul>
</xsl:template>
<xsl:template match="tr">
<li id="{td}">
<xsl:if test="key('lists', generate-id())">
<ul>
<xsl:apply-templates select="key('lists', generate-id())" />
</ul>
</xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>