我有一个递归节点,我正在尝试为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)
但是我不知道如何递归到"栏"内的嵌入式"栏",可能会有很多层次.
这是一种方式:
<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