Xslt XSL中的递归列表
我尝试为jquery checktree设置一个递归节点。节点看起来像Xslt XSL中的递归列表,xslt,recursion,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
foo/bar/ID
/NAME
/CHECKED
bar/ID
/NAME
/CHECKED
/bar/ID
/NAME
/bar/ID
/NAME
/bar/ID
/NAME
/CHECKED
/bar/ID
/NAME
/CHECKED
其中,任何条形图下方可能有一个或多个条形图节点,也可能没有,但任何条形图都将具有ID和名称,并且可能具有选中的
我想把它变成
<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>
-
...
-
...
我可以通过以下操作获得第一级:
<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>
-
选中的
但我不知道如何递归到“条”中嵌入的“条”,再递归到可能存在的多个级别。
选中的
选中的
这里有一种方法:
<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>
选中的
这依赖于“自动”模板匹配。为了确保匹配发生,您可以将
放入原始代码的
循环中,但是,您甚至可以对其进行改进,并使用此模板替换原始代码:
<xsl:template match="/foo">
<ul class="tree">
<xsl:apply-templates select="bar"/>
</ul>
</xsl:template>
如果需要更多控制,还可以使用
并在循环内调用命名模板(..
和
)。请参阅:这里有一种方法:
<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>
选中的
这依赖于“自动”模板匹配。为了确保匹配发生,您可以将
放入原始代码的
循环中,但是,您甚至可以对其进行改进,并使用此模板替换原始代码:
<xsl:template match="/foo">
<ul class="tree">
<xsl:apply-templates select="bar"/>
</ul>
</xsl:template>
如果需要更多控制,还可以使用
并在循环内调用命名模板(..
和
)。请参阅:这是一个完全由输入驱动的推式解决方案(仅模板匹配、无条件、无命名模板)的示例(实际上是概念验证):
选中的
应用于此输入XML时(根据您的问题推断):
nd1
节点1
钕
节点2
钕
节点3
钕
节点4
钕
节点5
钕6
节点6
它产生以下输出:
<ul class="tree">
<li>
<input type="checkbox" id="nd1" name="Node 1" checked="checked" />
<label for="nd1">Node 1</label>
<ul class="tree">
<li>
<input type="checkbox" id="nd2" name="Node 2" checked="checked" />
<label for="nd2">Node 2</label>
</li>
</ul>
</li>
<li>
<input type="checkbox" id="nd3" name="Node 3" />
<label for="nd3">Node 3</label>
</li>
<li>
<input type="checkbox" id="nd4" name="Node 4" />
<label for="nd4">Node 4</label>
<ul class="tree">
<li>
<input type="checkbox" id="nd5" name="Node 5" checked="checked" />
<label for="nd5">Node 5</label>
<ul class="tree">
<li>
<input type="checkbox" id="nd6" name="Node 6" checked="checked" />
<label for="nd6">Node 6</label>
</li>
</ul>
</li>
</ul>
</li>
</ul>
-
节点1
-
节点2
-
节点3
-
节点4
-
节点5
-
节点6
这是一个完全由输入驱动的推式解决方案(仅模板匹配、无条件、无命名模板)的示例(实际上是概念验证):
选中的
应用于此输入XML时(根据您的问题推断):
nd1
节点1
钕
节点2
钕
节点3
钕
节点4
钕
节点5
钕6
节点6
它产生以下输出:
<ul class="tree">
<li>
<input type="checkbox" id="nd1" name="Node 1" checked="checked" />
<label for="nd1">Node 1</label>
<ul class="tree">
<li>
<input type="checkbox" id="nd2" name="Node 2" checked="checked" />
<label for="nd2">Node 2</label>
</li>
</ul>
</li>
<li>
<input type="checkbox" id="nd3" name="Node 3" />
<label for="nd3">Node 3</label>
</li>
<li>
<input type="checkbox" id="nd4" name="Node 4" />
<label for="nd4">Node 4</label>
<ul class="tree">
<li>
<input type="checkbox" id="nd5" name="Node 5" checked="checked" />
<label for="nd5">Node 5</label>
<ul class="tree">
<li>
<input type="checkbox" id="nd6" name="Node 6" checked="checked" />
<label for="nd6">Node 6</label>
</li>
</ul>
</li>
</ul>
</li>
</ul>
-
节点1
-
节点2
-
节点3
-
节点4
-
节点5
-
节点6
@Paul:不要急于使用
。大多数时候,它阻碍了优雅的解决方案。试着用
来完成事情,这样不仅可以降低样式表的嵌套复杂性,还可以使您产生内容驱动的转换,而不是迭代/命令式的方法。@Tomalak:我基本上同意-如果可以的话,模板匹配可以提供最清晰的设计。但我发现我不能总是直接使用match来解决我自己的问题。但在这种情况下,我完全同意,匹配比每个+call@Paul:抵制使用
的冲动。大多数时候,它阻碍了优雅的解决方案。试着用
来完成事情,这样不仅可以降低样式表的嵌套复杂性,还可以使您产生内容驱动的转换,而不是迭代/命令式的方法。@Tomalak:我基本上同意-如果可以的话,模板匹配可以提供最清晰的设计。但我发现我不能总是直接使用match来解决我自己的问题。但在这种情况下,我完全同意,匹配比每个+调用都好。它似乎并没有找到第一个“条”。此外,我如何获得第一个
?@Paul Tomblin:您在这里看到的只是样式表的一部分,仅说明了递归。我将修改我的答案,以确保整个结构的匹配。谢谢