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

Popular posts from this blog

assembly - 8086 TASM: Illegal Indexing Mode -

Java, LWJGL, OpenGL 1.1, decoding BufferedImage to Bytebuffer and binding to OpenGL across classes -

javascript - addthis share facebook and google+ url -