[xsl] Grouping elements in xslt 1.0

Subject: [xsl] Grouping elements in xslt 1.0
From: lee qm <akimilee@xxxxxxxxx>
Date: Tue, 1 Dec 2009 15:50:02 +0800
I am using xslt 1.0.

Input xml (simplified version):

<?xml version="1.0" encoding="utf-8"?>
<ASBMessage id="id" version="version" timestamp="timestamp">
  <Body items="items">
     <AccountData operation="operation">
        <Account>
           <ID value="value" namespace="namespace"/>
           <ID value="value" namespace="namespace"/>
           <Type id="id"/>
        </Account>
     </AccountData>
  </Body>
</ASBMessage>


Expected output:

<?xml version="1.0" encoding="utf-8"?>
<data>
  <o t="TVEQE_ASBMessage">
     <a n="id">
        <v s="id"/>
     </a>
     <a n="timestamp">
        <v s="timestamp"/>
     </a>
     <a n="version">
        <v s="version"/>
     </a>
     <a n="TVEQE_Body">
        <o t="TVEQE_Body">
           <a n="items">
              <v s="items"/>
           </a>
           <a n="TVEQE_AccountData">
              <o t="TVEQE_AccountData">
                 <a n="operation">
                    <v s="operation"/>
                 </a>
                 <a n="TVEQE_Account">
                    <o t="TVEQE_Account">
                       <a n="TVEQE_ID">
                          <o t="TVEQE_ID">
                             <a n="namespace">
                                <v s="namespace"/>
                             </a>
                             <a n="value">
                                <v s="value"/>
                             </a>
                          </o>
                          <o t="TVEQE_ID">
                             <a n="namespace">
                                <v s="namespace"/>
                             </a>
                             <a n="value">
                                <v s="value"/>
                             </a>
                          </o>
                       </a>
                       <a n="TVEQE_Type">
                          <o t="TVEQE_Type">
                             <a n="id">
                                <v s="id"/>
                             </a>
                          </o>
                       </a>
                    </o>
                 </a>
              </o>
           </a>
        </o>
     </a>
  </o>
</data>


My xslt below does not generate the expected output for similar
element which appeared more than once.


<xsl:template match="/ASBMessage">
 <data>
 <o t="TVEQE_{name(.)}">
 <xsl:for-each select="@*">
 <a n="{name(.)}"><v s="{.}"></v></a>
 </xsl:for-each>
 <xsl:apply-templates/>
  </o>
 </data>
</xsl:template>

<xsl:template match="*">
 <a n="TVEQE_{name(.)}">
 <o t="TVEQE_{name(.)}">
 <xsl:for-each select="@*">
 <a n="{name(.)}"><v s="{.}"></v></a>
 </xsl:for-each>
 <xsl:apply-templates/>
 </o>
 </a>
 </xsl:template>


For example, for <ID> element which appeared twice, it generated,

                       <a n="TVEQE_ID">
                          <o t="TVEQE_ID">
                             <a n="namespace">
                                <v s="namespace"/>
                             </a>
                             <a n="value">
                                <v s="value"/>
                             </a>
                          </o>
                       </a>

                       <a n="TVEQE_ID">
                          <o t="TVEQE_ID">
                             <a n="namespace">
                                <v s="namespace"/>
                             </a>
                             <a n="value">
                                <v s="value"/>
                             </a>
                          </o>
                       </a>


The expected output is to have both ID element encapsulated in single
<a></a> element.
Any help is appreciated. Thanks.

Current Thread