xml - All tags one level, order group and sort in xslt -
i have issue xml (salesorder). import file (csv) xml-structure. tool used automatic creates xml file same structure. tags on same level.
<?xml version="1.0" encoding="utf-8"?> <order> <env> <sendercode>1234</sendercode> <test>n</test> </env> <hdr> <ordernumber>100</ordernumber> <orderdate>201206080000</orderdate> </hdr> <row> <linenumber>1</linenumber> <article>a</article> </row> <row> <linenumber>2</linenumber> <article>b</article> </row> <row> <linenumber>3</linenumber> <article>c</article> </row> <row> <linenumber>4</linenumber> <article>d</article> </row> <hdr> <ordernumber>101</ordernumber> <orderdate>201206080000</orderdate> </hdr> <row> <linenumber>1</linenumber> <article>e</article> </row> <row> <linenumber>2</linenumber> <article>f</article> </row> </order>
the output need is:
<?xml version="1.0" encoding="utf-8"?> <order> <env> <sendercode>1234</sendercode> <test>n</test> </env> <hdr> <ordernumber>100</ordernumber> <orderdate>201206080000</orderdate> <row> <linenumber>1</linenumber> <article>a</article> </row> <row> <linenumber>2</linenumber> <article>b</article> </row> <row> <linenumber>3</linenumber> <article>c</article> </row> <row> <linenumber>4</linenumber> <article>d</article> </row> </hdr> <env> <sendercode>1234</sendercode> <test>n</test> </env> <hdr> <ordernumber>101</ordernumber> <orderdate>201206080000</orderdate> <row> <linenumber>1</linenumber> <article>e</article> </row> <row> <linenumber>2</linenumber> <article>f</article> </row> </hdr> </order>
how xslt? when tried this, 6 row
tags under both hdr
(1) , hdr
(2).
<?xml version="1.0" encoding="utf-8"?> <order> <env> <sendercode>1234</sendercode> <test>n</test> </env> <hdr> <ordernumber>100</ordernumber> <orderdate>201206080000</orderdate> <row> <linenumber>1</linenumber> <article>a</article> </row> <row> <linenumber>2</linenumber> <article>b</article> </row> <row> <linenumber>3</linenumber> <article>c</article> </row> <row> <linenumber>4</linenumber> <article>d</article> </row> <row> <linenumber>1</linenumber> <article>e</article> </row> <row> <linenumber>2</linenumber> <article>f</article> </row> </hdr> <env> <sendercode>1234</sendercode> <test>n</test> </env> <hdr> <ordernumber>101</ordernumber> <orderdate>201206080000</orderdate> <row> <linenumber>1</linenumber> <article>a</article> </row> <row> <linenumber>2</linenumber> <article>b</article> </row> <row> <linenumber>3</linenumber> <article>c</article> </row> <row> <linenumber>4</linenumber> <article>d</article> </row> <row> <linenumber>1</linenumber> <article>e</article> </row> <row> <linenumber>2</linenumber> <article>f</article> </row> </hdr> </order>
could me?
thanks
this transform ask. uses key identify row
elements following each hdr
.
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:strip-space elements="*"/> <xsl:output method="xml" indent="yes" /> <xsl:key name="row-by-hdr-id" match="row" use="generate-id(preceding-sibling::hdr[1])"/> <xsl:template match="node()"> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="/order"> <xsl:copy> <xsl:apply-templates select="hdr"/> </xsl:copy> </xsl:template> <xsl:template match="hdr"> <xsl:apply-templates select="preceding-sibling::env"/> <xsl:copy> <xsl:apply-templates/> <xsl:apply-templates select="key('row-by-hdr-id', generate-id())"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
output
<?xml version="1.0" encoding="utf-8"?> <order> <env> <sendercode>1234</sendercode> <test>n</test> </env> <hdr> <ordernumber>100</ordernumber> <orderdate>201206080000</orderdate> <row> <linenumber>1</linenumber> <article>a</article> </row> <row> <linenumber>2</linenumber> <article>b</article> </row> <row> <linenumber>3</linenumber> <article>c</article> </row> <row> <linenumber>4</linenumber> <article>d</article> </row> </hdr> <env> <sendercode>1234</sendercode> <test>n</test> </env> <hdr> <ordernumber>101</ordernumber> <orderdate>201206080000</orderdate> <row> <linenumber>1</linenumber> <article>e</article> </row> <row> <linenumber>2</linenumber> <article>f</article> </row> </hdr> </order>
Comments
Post a Comment