如何使用XSLT在输出文档中添加新元素?

时间:2016-10-25 05:48:36

标签: xslt

我有输入文件。它是一张有一个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中添加元素链接以附加孩子?可能是我需要递归算法......

1 个答案:

答案 0 :(得分:0)

我认为你可以做的是使用一个键,将tr元素与第一个具有较低td值的兄弟姐妹相关联

 <xsl:key name="lists" match="tr" use="generate-id(preceding-sibling::tr[td &lt; 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 &lt; 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 &lt; 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>