ram.bi
ram.bi

Reputation: 283

Rename Duplicate XML Tags

I have some xml XML Document with duplicate tag names like below ::

<ROOT>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>321</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>123</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
</ROOT>

So i have to get total address but when i am applying XSLT i am getting only First Tag Value. Is there any possibilty to change that ADDRESS tag names to apropriate Tag names like STREET, CITY,STATE and ZIP Tags.

Upvotes: 0

Views: 1077

Answers (2)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243529

This transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:reps>
  <rep pos="1">STREET</rep>
  <rep pos="1">CITY</rep>
  <rep pos="1">STATE</rep>
  <rep pos="1">ZIP</rep>
 </my:reps>

 <xsl:variable name="vReps"
      select="document('')/*/my:reps/*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="ADDRESS">
  <xsl:variable name="vPos" select=
     "count(preceding-sibling::ADDRESS)+1"/>
  <xsl:element name="{$vReps[position()=$vPos]}">
    <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document:

<ROOT>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>321</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
    <RECORD>
        <ID>A1</ID>
        <NAME>Name1</NAME>
        <ADDRESS>StreetName</ADDRESS>
        <ADDRESS>CityName</ADDRESS>
        <ADDRESS>State</ADDRESS>
        <ADDRESS>123</ADDRESS>
        <PHONE>12345</PHONE>
    </RECORD>
</ROOT>

produces the wanted, correct result:

<ROOT>
   <RECORD>
      <ID>A1</ID>
      <NAME>Name1</NAME>
      <STREET>StreetName</STREET>
      <CITY>CityName</CITY>
      <STATE>State</STATE>
      <ZIP>321</ZIP>
      <PHONE>12345</PHONE>
   </RECORD>
   <RECORD>
      <ID>A1</ID>
      <NAME>Name1</NAME>
      <STREET>StreetName</STREET>
      <CITY>CityName</CITY>
      <STATE>State</STATE>
      <ZIP>123</ZIP>
      <PHONE>12345</PHONE>
   </RECORD>
</ROOT>

Explanation:

Overriding the identity rule with a template matching ADDRESS and generating an element according to the position of this ADDRESS element.

Upvotes: 2

Woody
Woody

Reputation: 5130

Yes, you can change the name if you want but that won't give you anything you didn't already have. Having the names street city state is no different to getting the nodes address[1], address[2], address[3]

Upvotes: 0

Related Questions