Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XSL中的递归列表_Xslt_Recursion - Fatal编程技术网

Xslt XSL中的递归列表

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

我尝试为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
其中,任何条形图下方可能有一个或多个条形图节点,也可能没有,但任何条形图都将具有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:您在这里看到的只是样式表的一部分,仅说明了递归。我将修改我的答案,以确保整个结构的匹配。谢谢