xslt中的递归调用

时间:2014-06-12 10:36:57

标签: xslt recursion

这是我输入的xml

<Nodes>
<Node Name = "a"/>
<Node Name = "b"/>
<Node Name = "c"/>
<Node Name = "d"/>
<Node Name = "e"/>
</Nodes>

我的输出应如下所示:

您可以看到的输出xml应该为每个节点递归调用。 节点a应该在最后,下一个节点应该从底部显示,因为你可以在输出xml中看到它。

<Rows>
<Node>                              
    <NestedNodes>
        <Node>
            <NestedNodes>
                <Node>
                    <NestedNodes>
                        <Node>
                            <NestedNodes>
                                <Node>
                                    <NodeMembers>
                                        <NodeMember refDataItem="e"/>
                                    </NodeMembers>
                                </Node>
                            </NestedNodes>
                            <NodeMembers>
                                <NodeMember refDataItem="d"/>
                            </NodeMembers>
                        </Node>
                    </NestedNodes>
                    <NodeMembers>
                        <NodeMember refDataItem="c"/>
                    </NodeMembers>
                </Node>
            </NestedNodes>
            <NodeMembers>
                <NodeMember refDataItem="b"/>
            </NodeMembers>
        </Node>
    </NestedNodes>
    <NodeMembers>
        <NodeMember refDataItem="a"/>
    </NodeMembers>
</Node>

每个“节点”应该采用以下结构:

<Node>
<NestedNodes>
<Node>
<NodeMembers>
<NodeMember refDataItem="e"/>
</NodeMembers>
</Node>
</NestedNodes>
<NodeMembers>
<NodeMember refDataItem="d"/>
</NodeMembers>
</Node>

NodeMember元素应包含节点名称,即'a'/'b'/'c'/'d'/'e'。

我试图通过应用递归来获得它,但它似乎不起作用。我无法循环回节点。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:2)

此XSLT 1.0转换

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="Nodes">
    <xsl:apply-templates select="Node[1]" />
  </xsl:template>

  <xsl:template match="Node">
    <xsl:copy>
      <xsl:if test="following-sibling::Node">
        <NestedNodes>
          <xsl:apply-templates select="following-sibling::Node[1]" />
        </NestedNodes>
      </xsl:if>
      <NodeMembers>
        <NodeMember refDataItem="{@Name}"/>
      </NodeMembers>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

给你

<Node>
  <NestedNodes>
    <Node>
      <NestedNodes>
        <Node>
          <NestedNodes>
            <Node>
              <NestedNodes>
                <Node>
                  <NodeMembers>
                    <NodeMember refDataItem="e"/>
                  </NodeMembers>
                </Node>
              </NestedNodes>
              <NodeMembers>
                <NodeMember refDataItem="d"/>
              </NodeMembers>
            </Node>
          </NestedNodes>
          <NodeMembers>
            <NodeMember refDataItem="c"/>
          </NodeMembers>
        </Node>
      </NestedNodes>
      <NodeMembers>
        <NodeMember refDataItem="b"/>
      </NodeMembers>
    </Node>
  </NestedNodes>
  <NodeMembers>
    <NodeMember refDataItem="a"/>
  </NodeMembers>
</Node>