XSL中的列表的递归列表

Pau*_*lin 1 xslt recursion

我有一个递归节点,我正在尝试为jquery-checktree设置.节点看起来像

foo/bar/ID
       /NAME
       /CHECKED
       bar/ID
          /NAME
          /CHECKED
   /bar/ID
       /NAME
   /bar/ID
       /NAME
       /bar/ID
           /NAME
           /CHECKED
           /bar/ID
               /NAME
               /CHECKED
Run Code Online (Sandbox Code Playgroud)

任何栏可能会或可能不会在其下方有一个或多个栏节点,但任何栏都有ID和NAME,并且可能有CHECKED.

我想把它变成

<ul>
  <li><input type="checkbox" name="..." value="..." checked="checked"></input>
      <label for="...">...</label>
      <ul>
        <li><input type="checkbox" name="..." value="..." checked="checked"></input>
          <label for="...">...</label>
        </li>
      </ul>
  <li>....</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式获得第一级:

    <ul class="tree">
    <xsl:for-each select="/foo/bar/">
        <li><input type="checkbox" name="{ID}" value="{ID}">
            <xsl:if test="CHECKED = 'Y'"><xsl:attribute name="checked">checked</xsl:attribute></xsl:if>
            </input><label for="{ID}"><xsl:value-of select="NAME"/></label>
        </li>
    </xsl:for-each>
    </ul>
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何递归到"栏"内的嵌入式"栏",可能会有很多层次.

Rol*_*man 5

这是一种方式:

<xsl:template match="bar">
    <li>
        <input type="checkbox" name="{ID}" value="{ID}">
            <xsl:if test="CHECKED = 'Y'">
                <xsl:attribute name="checked">checked</xsl:attribute>
            </xsl:if>
        </input>
        <label for="{ID}"><xsl:value-of select="NAME"/></label>
        <!-- 

            If we have bar children, make a list and recurse

        -->
        <xsl:if test="bar">
            <ul>
                <xsl:apply-templates select="bar"/>
            </ul>
        </xsl:if>
    </li>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

这依赖于"自动"模板匹配.为确保匹配发生,您可以在原始代码<xsl:apply-templates/><xsl:for-each>循环内部放置,但是,您甚至可以改进所有代码并使用此模板替换原始代码:

<xsl:template match="/foo">
   <ul class="tree">
       <xsl:apply-templates select="bar"/>
   </ul>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

如果您想要更多控制,您还可以在循环内使用<xsl:for-each select="bar">并调用命名模板(<xsl:template name="some-name">...<xsl:call-template>).请参阅:http://www.w3.org/TR/xslt#named-templates