Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I want to convert an XML with repeating elements into another XML with elements grouped based on position.

Sample input XML

<root>
  <param>test1</param>
  <param>test2</param>
  <param>test3</param>
  <param>test4</param>
  <param>test5</param>
  <param>test6</param>
  <param>test7</param>
  <param>test8</param>
</root>

Desired output

<root>
   <group>
      <param>test1</param>
      <param>test2</param>
      <param>test3</param>
   </group>
   <group>
      <param>test4</param>
      <param>test5</param>
      <param>test6</param>
   </group>
   <group>
      <param>test7</param>
      <param>test8</param>
   </group>
</root>

Each <group> in the output has x number of <param>, in my example x=3. The last <group> may contain less number of <param> based on the input.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
147 views
Welcome To Ask or Share your Answers For Others

1 Answer

You could do:

XSLT 1.0

<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="/root">
    <xsl:copy>
        <xsl:for-each select="param[position() mod 3 = 1]">
            <group>
                <xsl:copy-of select=". | following-sibling::param[position() &lt; 3]"/>
            </group>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...