XSLT Transforming sequential XML to hierarchical XML
Posted
by
Jean-Paul Smit
on Stack Overflow
See other posts from Stack Overflow
or by Jean-Paul Smit
Published on 2012-12-06T15:47:36Z
Indexed on
2012/12/07
5:04 UTC
Read the original article
Hit count: 267
I have a requirement to transform a sequential XML node list into a hierarchical, but I run into some XSLT specific knowledge gap. The input XML contains articles, colors and sizes. In the sample below 'Record1' is an article, 'Record2' represents a color and 'Record3' are the sizes. The number of colors and sizes (record2 and record3) elements can vary.
<root>
<Record1>...</Record1>
<Record2>...</Record2>
<Record3>...</Record3>
<Record3>...</Record3>
<Record2>...</Record2>
<Record3>...</Record3>
<Record3>...</Record3>
<Record3>...</Record3>
<Record3>...</Record3>
<Record1>...</Record1>
<Record2>...</Record2>
<Record3>...</Record3>
<Record3>...</Record3>
<Record2>...</Record2>
<Record3>...</Record3>
<Record3>...</Record3>
<Record3>...</Record3>
<Record3>...</Record3>
</root>
All fields are on the same hierarchical level, but still I have to create this structure as output:
<root>
<article> -> Record1
<color> -> Record2
<size>...</size> -> Record3
<size>...</size> -> Record3
</color>
<color> -> Record2
<size>...</size> -> Record3
<size>...</size> -> Record3
<size>...</size> -> Record3
<size>...</size> -> Record3
</color>
</article>
<article> -> Record1
<color> -> Record2
<size>...</size> -> Record3
<size>...</size> -> Record3
</color>
<color> -> Record2
<size>...</size> -> Record3
<size>...</size> -> Record3
<size>...</size> -> Record3
<size>...</size> -> Record3
</color>
</article>
</root>
I've tried to iterate the nodes sequentially but for example the 'article' (=record1) node tag needs to remain unclosed while 'color' (=record2) nodes are processed. The same counts for processing 'size' (=record3) having 'color' unclosed, but that is not allowed by XSLT. My next idea was to call a template for every article, color and size level, but I don't know how to select for example all 'record3' nodes between the current 'record2' and the next article represented by 'record1'.
I've also got a limitation on the XSLT version because I need this transformation in BizTalk Server which only supports XSLT 1.0
Can someone push me in the right direction?
© Stack Overflow or respective owner