xml - Iterate over number in element name -
i create loop in xslt converts following xml:
<payments> <payment_batch_id>987654321</payment_batch_id> <payment_number1_amount>123456789</payment_number1_amount> <payment_number1_currency>eur</payment_number1_currency> <payment_number1_date>19700101</payment_number1_date> <payment_string1_description>description</payment_string1_description> <payment_number2_amount>123456789</payment_number2_amount> <payment_number2_currency>gbp</payment_number2_currency> <payment_number2_date>19700101</payment_number2_date> <payment_string2_description>description</payment_string2_description> <payment_numbern_amount>123456789</payment_numbern_amount> <payment_numbern_currency>chf</payment_numbern_currency> <payment_numbern_date>19700101</payment_numbern_date> <payment_stringn_description>description</payment_stringn_description> </payments> into xml:
<payments> <payment> <currency>eur</currency> <amount>123456789</amount> <date>19700101</date> </payment> <payment> <currency>gbp</currency> <amount>123456789</amount> <date>19700101</date> </payment> <payment> <currency>chf</currency> <amount>123456789</amount> <date>19700101</date> </payment> </payments> note n can number, can have number of payments. , using xslt 2.0.
i unable find out how iterate on number in element name. please help?
cheers,
tuno
the stylesheet
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="2.0"> <xsl:output indent="yes"/> <xsl:template match="payments"> <xsl:copy> <xsl:for-each-group select="*" group-by="replace(local-name(), '\d+', '')"> <payment> <xsl:apply-templates select="current-group()"/> </payment> </xsl:for-each-group> </xsl:copy> </xsl:template> <xsl:template match="payments/*"> <xsl:element name="{substring-after(substring-after(local-name(), '_'), '_')}"> <xsl:value-of select="."/> </xsl:element> </xsl:template> </xsl:stylesheet> transforms
<payments> <payment_number1_currency>eur</payment_number1_currency> <payment_number1_amount>123456789</payment_number1_amount> <payment_number1_date>19700101</payment_number1_date> <payment_number2_currency>gbp</payment_number2_currency> <payment_number2_amount>123456789</payment_number2_amount> <payment_number2_date>19700101</payment_number2_date> <payment_numbern_currency>chf</payment_numbern_currency> <payment_numbern_amount>123456789</payment_numbern_amount> <payment_numbern_date>19700101</payment_numbern_date> </payments> into
<payments> <payment> <currency>eur</currency> <amount>123456789</amount> <date>19700101</date> </payment> <payment> <currency>gbp</currency> <amount>123456789</amount> <date>19700101</date> </payment> <payment> <currency>chf</currency> <amount>123456789</amount> <date>19700101</date> </payment> </payments> if don't want elements , want change order of elements in output need explicitly list them:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="2.0"> <xsl:output indent="yes"/> <xsl:template match="payments"> <xsl:copy> <xsl:for-each-group select="* except payment_batch_id" group-by="replace(local-name(), '\d+', '')"> <payment> <xsl:apply-templates select="current-group()[self::*[contains(local-name(), 'currency')]], current-group()[self::*[contains(local-name(), 'amount')]], current-group()[self::*[contains(local-name(), 'date')]]"/> </payment> </xsl:for-each-group> </xsl:copy> </xsl:template> <xsl:template match="payments/*"> <xsl:element name="{substring-after(substring-after(local-name(), '_'), '_')}"> <xsl:value-of select="."/> </xsl:element> </xsl:template> </xsl:stylesheet> with stylesheet , input
<payments> <payment_batch_id>987654321</payment_batch_id> <payment_number1_amount>123456789</payment_number1_amount> <payment_number1_currency>eur</payment_number1_currency> <payment_number1_date>19700101</payment_number1_date> <payment_string1_description>description</payment_string1_description> <payment_number2_amount>123456789</payment_number2_amount> <payment_number2_currency>gbp</payment_number2_currency> <payment_number2_date>19700101</payment_number2_date> <payment_string2_description>description</payment_string2_description> <payment_numbern_amount>123456789</payment_numbern_amount> <payment_numbern_currency>chf</payment_numbern_currency> <payment_numbern_date>19700101</payment_numbern_date> <payment_stringn_description>description</payment_stringn_description> </payments> saxon 9.5 outputs
<payments> <payment> <currency>eur</currency> <amount>123456789</amount> <date>19700101</date> </payment> <payment> <currency>gbp</currency> <amount>123456789</amount> <date>19700101</date> </payment> <payment> <currency>chf</currency> <amount>123456789</amount> <date>19700101</date> </payment> </payments>
Comments
Post a Comment