Friday 15 March 2013

xml - XSLT Tag with N Values to Tag with One Value -



xml - XSLT Tag with N Values to Tag with One Value -

i have situation downwards there:

<getnewordersresponse> <getnewordersresult> <receipts> <idorder>1</idorder> <idorder>2</idorder> <idorder>3</idorder> </receipts> </getnewordersresult> </getnewordersresponse>

and want transform structure

<getnewordersresponse> <getnewordersresult> <receipts> <idorder>1</idorder> </receipts> <receipts> <idorder>2</idorder> </receipts> <receipts> <idorder>3</idorder> </receipts> </getnewordersresult> </getnewordersresponse>

i have tried code, didn't success:

<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <ns0:test xmlns:ns0="http://test/getneworders"> <getnewordersresponse> <getnewordersresult> <receipts> <idorder> <xsl:for-each select="getnewordersresponse/getnewordersresult/receipts/idorder"> <xsl:value-of select="idorder"/> </xsl:for-each> </idorder> </receipts> </getnewordersresult> </getnewordersresponse> </ns0:test> </xsl:template> </xsl:stylesheet>

this trivial, using identity transform template rule , couple of exceptions rule:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> <xsl:strip-space elements="*"/> <!-- identity transform --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="receipts"> <xsl:apply-templates select="@*|node()"/> </xsl:template> <xsl:template match="idorder"> <receipts> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </receipts> </xsl:template> </xsl:stylesheet>

or, if prefer going logic of attempt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> <xsl:template match="/"> <getnewordersresponse> <getnewordersresult> <xsl:for-each select="getnewordersresponse/getnewordersresult/receipts/idorder"> <receipts> <xsl:copy-of select="."/> </receipts> </xsl:for-each> </getnewordersresult> </getnewordersresponse> </xsl:template> </xsl:stylesheet>

xml xslt transformation

No comments:

Post a Comment