Andromeda
Andromeda

Reputation: 12897

XSLT to combine multiple values

I have an xml with below structure. Will have mutiple assets of different type (PhoneNumbers and IP addrsses).

<Assets>    
 <Asset>        
   <Name>PhoneNumber</Name>         
   <Params>             
     <Param>
        <Name>number</Name>
        <Value>+54123232</Value>            
     </Param>       
   </Params>    
  </Asset>  
  <Asset>       
      <Name>IPAddress</Name>        
      <Params>          
          <Param>
                <Name>IPv4</Name>
                <Value>1.1.1.1</Value>          
          </Param>          
          <Param>
                <Name>IPv6</Name>
                <Value>2.2.2.2</Value>          
          </Param>      
       </Params>    
     </Asset>   
     <Asset>        
         <Name>PhoneNumber</Name>       
         <Params>           
             <Param>
                <Name>number</Name>
                <Value>+123456789</Value>           
             </Param>       
         </Params>  
     </Asset> 
  </Assets>

I want to write one xslt to transform it into below structure. All PhoneNumber will be combined into a single asset with all phone numbers inside it.

<Assets>
    <Asset>
        <Name>PhoneNumberBlock</Name>
        <PhoneNumbers>
             <PhoneNumber>+54123232</PhoneNumber>
             <PhoneNumber>+123456789</PhoneNumber>
        </PhoneNumbers>
    <Asset>
    <Asset>
        <Name>IPBlock</Name>
        <IPv4Address>1.1.1.1</IPv4Address>
        <IPv6Address>2.2.2.2</IPv6Address>
    <Asset>
</Assets>

I know only basic xslt foreach/switch/choose/if and all. Not familiar with how to use templates. Could any one please help and point me in the right direction.

Upvotes: 0

Views: 86

Answers (1)

hr_117
hr_117

Reputation: 9627

There seems not be a general rule for grouping by Asset/Name. Therefor you may try this straight foreword solution:

<xsl:template match="Assets" >
  <Assets>
   <Asset>
    <Name>PhoneNumberBlock</Name>
    <PhoneNumbers>
       <xsl:apply-templates select="Asset[Name='PhoneNumber']/Params/*" />
    </PhoneNumbers>
  </Asset>
  <Asset>
      <Name>IPBlock</Name>
       <xsl:apply-templates select="Asset[Name='IPAddress']/Params/*" />
  </Asset>
</Assets>
</xsl:template>

<xsl:template match="Param[Name='number']" >
  <PhoneNumber><xsl:value-of select="Value"/></PhoneNumber>
</xsl:template>
<xsl:template match="Param[Name='IPv4']" >
  <IPv4Address><xsl:value-of select="Value"/></IPv4Address>
</xsl:template>
<xsl:template match="Param[Name='IPv6']" >
  <IPv6Address><xsl:value-of select="Value"/></IPv6Address>
</xsl:template>

Upvotes: 2

Related Questions