Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

I saw an example to transform xml to another xml using JSTL. But in that example they hard coded the attribute value. Please see the bellow example

Input XML

country isocode="de" pk="8796093055010" uri="http://localhost:9001/ws410/rest/countries/de">
        <comments/>
        <creationtime>2011-08-03T21:53:35.624+05:30</creationtime>
        <dimVals/>
        <modifiedtime>2011-08-03T22:05:10.111+05:30</modifiedtime>
        <active>true</active>
        <name>Germany</name>
        <regions>
              <region isocode="DE-BW" pk="8796093055011" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-BW"/>
              <region isocode="DE-BY" pk="8796093087779" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-BY"/>
              <region isocode="DE-BE" pk="8796093120547" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-BE"/>
              <region isocode="DE-BR" pk="8796093153315" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-BR"/>
              <region isocode="DE-HB" pk="8796093186083" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-HB"/>
              <region isocode="DE-HH" pk="8796093218851" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-HH"/>
              <region isocode="DE-HE" pk="8796093251619" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-HE"/>
              <region isocode="DE-MV" pk="8796093284387" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-MV"/>
              <region isocode="DE-NI" pk="8796093317155" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-NI"/>
              <region isocode="DE-NW" pk="8796093349923" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-NW"/>
              <region isocode="DE-RP" pk="8796093382691" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-RP"/>
              <region isocode="DE-SL" pk="8796093415459" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-SL"/>
              <region isocode="DE-ST" pk="8796093448227" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-ST"/>
              <region isocode="DE-SN" pk="8796093480995" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-SN"/>
              <region isocode="DE-SH" pk="8796093513763" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-SH"/>
              <region isocode="DE-TH" pk="8796093546531" uri="http://localhost:9001/ws410/rest/countries/de/regions/DE-TH"/>
        </regions>
        <zones>
            <zone code="de" pk="8796093056179" uri="http://localhost:9001/ws410/rest/zones/de"/>
        </zones>
</country>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <xsl:apply-templates select="/country/regions" />
    </xsl:template>

    <xsl:template match="regions">
        <RECORDS>
            <xsl:for-each select="region">
                <RECORD>
                    <PROP name="isocode">
                        <PVAL>
                            <xsl:value-of select="@isocode" />
                        </PVAL>
                    </PROP>
                    <PROP name="pk">
                        <PVAL>
                            <xsl:value-of select="@pk" />
                        </PVAL>
                    </PROP>
                    <PROP name="uri">
                        <PVAL>
                            <xsl:value-of select="@uri" />
                        </PVAL>
                    </PROP>
                </RECORD>
            </xsl:for-each>
        </RECORDS>
    </xsl:template>
</xsl:stylesheet>

Output XML

<?xml version="1.0" encoding="UTF-8"?>
<RECORDS>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-BW</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093055011</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-BW</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-BY</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093087779</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-BY</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-BE</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093120547</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-BE</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-BR</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093153315</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-BR</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-HB</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093186083</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-HB</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-HH</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093218851</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-HH</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-HE</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093251619</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-HE</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-MV</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093284387</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-MV</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-NI</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093317155</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-NI</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-NW</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093349923</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-NW</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-RP</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093382691</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-RP</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-SL</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093415459</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-SL</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-ST</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093448227</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-ST</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-SN</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093480995</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-SN</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-SH</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093513763</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-SH</PVAL>
        </PROP>
    </RECORD>
    <RECORD>
        <PROP name="isocode">
            <PVAL>DE-TH</PVAL>
        </PROP>
        <PROP name="pk">
            <PVAL>8796093546531</PVAL>
        </PROP>
        <PROP name="uri">
            <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-TH</PVAL>
        </PROP>
    </RECORD>
</RECORDS>

In this output xml I am creating many RECORD sub elements. My problem is I want to transform the PROB name attribute () value without hardcoding. I need to read the reagion element attributtes from input xml and transform that value to output xml. Please help me to find the solution.
Thank you...

share|improve this question

1 Answer 1

up vote 1 down vote accepted

I believe this is what you are looking for:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <xsl:apply-templates select="/country/regions" />
  </xsl:template>

  <xsl:template match="regions">
    <RECORDS>
      <xsl:apply-templates select="region" />
    </RECORDS>
  </xsl:template>

  <xsl:template match="region">
    <RECORD>
      <xsl:apply-templates select="@*" />
    </RECORD>
  </xsl:template>

  <xsl:template match="region/@*">
    <PROP name="{name()}">
      <PVAL>
        <xsl:value-of select="." />
      </PVAL>
    </PROP>
  </xsl:template>
</xsl:stylesheet>

When run on your input XML, this produces the output:

<RECORDS>
  <RECORD>
    <PROP name="isocode">
      <PVAL>DE-BW</PVAL>
    </PROP>
    <PROP name="pk">
      <PVAL>8796093055011</PVAL>
    </PROP>
    <PROP name="uri">
      <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-BW</PVAL>
    </PROP>
  </RECORD>
  <RECORD>
    <PROP name="isocode">
      <PVAL>DE-BY</PVAL>
    </PROP>
    <PROP name="pk">
      <PVAL>8796093087779</PVAL>
    </PROP>
    <PROP name="uri">
      <PVAL>http://localhost:9001/ws410/rest/countries/de/regions/DE-BY</PVAL>
    </PROP>
  </RECORD>
  <!-- (Several more similar records) -->
</RECORDS>
share|improve this answer
    
Yes. This is the one I want to do. Thanks a lot. –  user1586908 Feb 6 '13 at 5:44
    
@user1586908 Great. You're welcome. If it works, please remember to accept the answer by clicking the checkmark icon next to it. Thanks! –  JLRishe Feb 6 '13 at 5:57

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.