Reputation: 203
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
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