user1482807
user1482807

Reputation: 203

Recursive Call in xslt

This is my input xml

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

My output should look like below:

The output xml as u can see should be called recursively for each Node. The Node a should be at last and the next nodes should be displayed from the bottom as u can see it in output 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>

Each "Node" should be in the following structure:

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

The NodeMember Element should contain the node name, ie, 'a' / 'b' / 'c' / 'd' / 'e'.

I tried to get this by applying recursion but it does not seem to work. I'm unable to loop back the nodes. Can anyone help me please.

Upvotes: 1

Views: 370

Answers (1)

Tomalak
Tomalak

Reputation: 338406

This XSLT 1.0 transformation

<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>

gives you

<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>

Upvotes: 3

Related Questions