Reputation: 12897
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
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