XSLT transformaton (result XML shld be in same sequence always...

Discussion in 'XML' started by ravi.velamuri@gmail.com, Feb 25, 2006.

  1. Guest

    Hi,

    1. My source XML will almost look like attached "Source.XML"

    2. I have to transform that into Destination XML almost look like
    attached"Dest.xml"

    Here, my destination XML should be always in the same sequence of
    elements as it is in sample shown whatever way the Source XML
    comes...OR XSL transforms it...

    Please advice how to I achieve it...One rude way is write for each
    Column Details one For loop...which is worst, I know in all ways.

    Your early advice will help me a lot. (let me know if any further
    clarification required on my prob).

    Ravi Velamuri.

    Source.xml:

    <?xml version="1.0"?>
    <TEST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="file:///d:sample.xsd">
    <Table_Info>
    <Table_Name>TBLGS_COUNTRY</Table_Name>
    <Operation_Type>I</Operation_Type>
    <Prev_Seq>190952</Prev_Seq>
    <Curr_Seq/>
    </Table_Info>
    <Table_Data>
    <Col_Details>
    <Col_Name>GS_CURR</Col_Name>
    <Col_Value>JPY</Col_Value>
    </Col_Details>
    <Col_Details>
    <Col_Name>GS_CTRY_ABBR</Col_Name>
    <Col_Value/>
    </Col_Details>
    <Col_Details>
    <Col_Name>GS_CTRY</Col_Name>
    <Col_Value>CTRY attribute</Col_Value>
    </Col_Details>
    <Col_Details>
    <Col_Name>GS_CTRY_DES</Col_Name>
    <Col_Value>JAPAN</Col_Value>
    </Col_Details>
    <Col_Details>
    <Col_Name>BLB_ISO_CTRY</Col_Name>
    <Col_Value>JP</Col_Value>
    </Col_Details>
    <Col_Details>
    <Col_Name>BLB_ISO_CTRY_DES</Col_Name>
    <Col_Value/>
    </Col_Details>
    <Col_Details>
    <Col_Name>BLB_CDR_CTRY</Col_Name>
    <Col_Value/>
    </Col_Details>
    </Table_Data>
    <Error_Info>
    <Error_Msg1/>
    <Error_Msg2/>
    </Error_Info>
    </TEST>

    XSL transform logic:

    <?xml version='1.0' ?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:abc="http://www.abc.com/xml"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:eek:utput method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template name="country">
    <xsl:for-each select="TEST/Table_Data/Col_Details">
    <xsl:if test="Col_Name = 'BLB_ISO_CTRY'">
    <test:code>
    <xsl:value-of select="Col_Value"/>
    </test:code>
    </xsl:if>
    <xsl:if test="Col_Name= 'GS_CTRY_DES'">
    <test:name>
    <xsl:value-of select="Col_Value"/>
    </test:name>
    </xsl:if>

    <xsl:if test="Col_Name = 'GS_REGION_CODE'">
    <test:timezone>
    <xsl:value-of select="Col_Value"/>
    </test:timezone>
    </xsl:if>
    <xsl:if test="Col_Name = 'GS_CTRY'">
    <attribute>
    <test:name>
    GS_CTRY
    </test:name>
    <test:value>
    <xsl:value-of select="Col_Value"/>
    </test:value>
    </attribute>
    </xsl:if>
    <xsl:if test="Col_Name = 'GS_CURR'">
    <attribute>
    <test:name>
    GS_CURR
    </test:name>
    <test:value>
    <xsl:value-of select="Col_Value"/>
    </test:value>
    </attribute>
    </xsl:if>
    </xsl:for-each>
    <test:enabled> true </test:enabled>
    </xsl:template>
    </xsl:stylesheet>



    Dest.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <test:testDocument
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:abc="http:/
    /www.abc.com/xml">
    <test:testObject test:type="TBLGS_COUNTRY" action="I">
    <test:Attribute>
    <test:name>GS_CTRY</test:name>
    <test:value>949</test:value>
    </test:Attribute>
    <test:Attribute>
    <test:name>GS_CURR</test:name>
    <test:value/>
    </test:Attribute>
    <test:name/>
    <test:code/>
    <test:timezone/>
    <test:enabled>true</test:enabled>
    <test:activeFrom>1970-01-01+00:00</test:activeFrom>
    <test:activeTo>2100-01-01+00:00</test:activeTo>
    <test:holiday/>
    </test:testObject>
    </test:testDocument>
     
    , Feb 25, 2006
    #1
    1. Advertising

  2. Please tell me, do you get to design the input language? If so, there
    might be better things to do.

    However, there are nicer ways to represent what you are doing now.

    One is to use xsl:choose instead of a list of xsl:if elements. This
    doesn't actually give you anything other than it looks nicer.

    <xsl:choose>
    <xsl:when test="Col_Name = 'BLB_ISO_CTRY'">
    ...
    </xsl:when>
    ...
    </xsl:choose>

    Another, more modular approach is to use an apply templates. This lets
    you import templates from other xsl files.

    <xsl:apply-templates select="TEST/Table_Data/Col_Details"
    mode="col_details"/>

    and then have templates of the form:

    <xsl:template match="Col_Name = 'BLB_ISO_CTRY'" mode="col_details">
    ...
    </xsl:template>
     
    Crutcher Dunnavant, Feb 26, 2006
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Christopher Brewster
    Replies:
    5
    Views:
    349
    John Machin
    Nov 14, 2008
  2. Pavel
    Replies:
    7
    Views:
    539
    Pavel
    Sep 19, 2010
  3. Michael Tan
    Replies:
    32
    Views:
    1,005
    Ara.T.Howard
    Jul 21, 2005
  4. Stefano Crocco
    Replies:
    4
    Views:
    140
    Rados³aw Bu³at
    Feb 5, 2009
  5. PL
    Replies:
    2
    Views:
    228
    Brian McCauley
    Dec 14, 2004
Loading...

Share This Page