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