Identitity Template Problem - Best Practices - What order to makechanges

Discussion in 'XML' started by johkar, Oct 19, 2009.

  1. johkar

    johkar Guest

    I have source XML that is 5-10 MB in size. I am transforming it from
    XML to XML. I am having some issues with overwriting changes that I
    have already made. I have come to the realization when using template
    match you need to do things in a certain order so as to not overwrite
    changes already made. For example if you first remove all currency
    formatting on the entire document and then copy nodes containing
    formatted currency to a new level...the currency formatting is back.

    There are five things I need to do with the XML...at various levels
    and in more than one place...nothing too complicated:

    1) Replace element names
    2) Make elements child elements by adding a brand new parent node.
    3) Remove elements entirely
    4) Add new elements/values
    5) Remove all currency formatting

    My questions are:
    1) Do I work from the root element and go deeper so that I don't
    overwrite...in general what is the best strategy?
    2) Do I have one identity template and one primary template match that
    I put all my apply-templates within so that nothing is copied to the
    output until all changes are made?
    3) How can I use a common template to strip currency formatting for
    any section of the XML that I might also be doing other changes too?
    There is probably an easier template remove formatting than the one I
    am using below.

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


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

    <!-- REMOVE CURRENCY FORMATTING -->
    <xsl:template match="text()[starts-with(.,'$') or starts-with(.,'($')
    or starts-with(.,'-$') or contains(.,',')]">

    <!-- REPLACE LEADING PARENTHESIS WITH MINUS SIGN AND REMOVE COMMAS --
    >


    <xsl:variable name="txt" select="translate(translate
    (.,',',''),'(','-')"/>

    <xsl:choose>
    <!--REMOVE ALL CHARACTERS EXCEPT NUMBERS, DECIMALS AND MINUS SIGNS--
    >

    <xsl:when test="starts-with($txt,'$') or starts-with($txt,'-$')">
    <xsl:value-of select="translate($txt,translate
    ($txt,'0123456789.-',''),'')"/>
    </xsl:when>
    <!--FOR FIELDS WITHOUT DOLLAR SIGNS, TEST TO SEE IF NUMBER-->
    <xsl:when test="number($txt) = number($txt)">
    <xsl:value-of select="$txt"/>
    </xsl:when>
    <!--PASS THROUGH TEXT BECAUSE IT IS NOT A NUMBER-->
    <xsl:eek:therwise>
    <xsl:value-of select="."/>
    </xsl:eek:therwise>
    </xsl:choose>
    </xsl:template>
    </xsl:stylesheet>
     
    johkar, Oct 19, 2009
    #1
    1. Advertising

  2. Re: Identitity Template Problem - Best Practices - What order tomake changes

    johkar wrote:
    > 1) Do I work from the root element and go deeper so that I don't
    > overwrite...in general what is the best strategy?


    You can't "overwrite" using XSLT. Things are output in the order, and
    nesting, that the stylesheet outputs them in. Focus on what you want to
    output and where you want to draw the information from. If the output
    document will follow roughly the same structure as the input document, a
    simple recursive tree walk via the xsl:apply-template operation and a
    template for each node that needs special handling (typically with the
    identity template as a catch-all for those nodes which can be copied
    through unchanged) is best practice. In those places where the output
    diverges from that structure, write the stylesheet logic "pull-style" --
    generate the appropriately nested elements/attributes/text, with
    xsl:value or attribute value templates used to explicitly retrieve the
    information.

    > 2) Do I have one identity template and one primary template match that
    > I put all my apply-templates within so that nothing is copied to the
    > output until all changes are made?


    XSLT does not "make changes". It generates a new output document, which
    is typically (but not guaranteed to be) written to the output as
    stylesheet processing takes place. If that isn't acceptable, I'd suggest
    you have the stylesheet write to a buffer of some variety -- eg, build a
    DOM tree -- which you can then process atomically.

    > 3) How can I use a common template to strip currency formatting for
    > any section of the XML that I might also be doing other changes too?


    See the xsl:call-template operation, which essentially lets you use a
    named template as a subroutine for other templates.
     
    Joe Kesselman, Oct 19, 2009
    #2
    1. Advertising

  3. johkar

    johkar Guest

    On Oct 18, 8:01 pm, Joe Kesselman <>
    wrote:
    > johkar wrote:
    > > 1) Do I work from the root element and go deeper so that I don't
    > > overwrite...in general what is the best strategy?

    >
    > You can't "overwrite" using XSLT. Things are output in the order, and
    > nesting, that the stylesheet outputs them in. Focus on what you want to
    > output and where you want to draw the information from. If the output
    > document will follow roughly the same structure as the input document, a
    > simple recursive tree walk via the xsl:apply-template operation and a
    > template for each node that needs special handling (typically with the
    > identity template as a catch-all for those nodes which can be copied
    > through unchanged) is best practice. In those places where the output
    > diverges from that structure, write the stylesheet logic "pull-style" --
    > generate the appropriately nested elements/attributes/text, with
    > xsl:value or attribute value templates used to explicitly retrieve the
    > information.
    >
    > > 2) Do I have one identity template and one primary template match that
    > > I put all my apply-templates within so that nothing is copied to the
    > > output until all changes are made?

    >
    > XSLT does not "make changes". It generates a new output document, which
    > is typically (but not guaranteed to be) written to the output as
    > stylesheet processing takes place. If that isn't acceptable, I'd suggest
    > you have the stylesheet write to a buffer of some variety -- eg, build a
    > DOM tree -- which you can then process atomically.
    >
    > > 3) How can I use a common template to strip currency formatting for
    > > any section of the XML that I might also be doing other changes too?

    >
    > See the xsl:call-template operation, which essentially lets you use a
    > named template as a subroutine for other templates.


    Thanks for the reply. I think my main issue is that I was using push
    style ALL the time and using separate templates out of the XML
    structure sequence. I think I need to mix in push style when
    appropriate. I am familiar with call-template but still have some
    confusion on how one would use it to remove the currency formatting on
    any text() that meets the criteria. Can you provide any more
    guidance?
     
    johkar, Oct 19, 2009
    #3
    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. karim
    Replies:
    0
    Views:
    467
    karim
    Jul 13, 2003
  2. John Dalberg
    Replies:
    3
    Views:
    575
    samuelhon
    Nov 16, 2006
  3. Replies:
    2
    Views:
    388
  4. er
    Replies:
    4
    Views:
    840
  5. Chicken McNuggets

    Best book on C gotchas and best practices?

    Chicken McNuggets, Jul 31, 2013, in forum: C Programming
    Replies:
    9
    Views:
    270
    Fred J. Tydeman
    Aug 5, 2013
Loading...

Share This Page