xsl-list
[Top] [All Lists]

Re: [xsl] Antwort: RE: [xsl] bad programming for speedup?

2007-07-24 05:53:41
Hi,

Is the OP sure that the elements wrapping the rows cannot be determined
beforehand and have templates set up for those? If so, from what I can
see, all that is needed is:

<xsl:template match="tbl-type1 | tbl-type2 | tbl-type-etc">
  <table>
    <xsl:apply-templates/>
  </table>
</xsl:template>

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

best,
-Rob


On Tue, 2007-07-24 at 14:46 +0200, Abel Braaksma wrote:
Hi Christoph,

Have you tried the other suggestions? Mainly Andrew's method (or mine 
even, if the below does what I think it does).

Please allow me to make some suggestions on your code below:



christoph(_dot_)naber(_at_)daimlerchrysler(_dot_)com wrote:
  
      <xsl:template match="/">
                <xsl:apply-templates />
        </xsl:template>
  


This is not necessary in this particular template. However, you may feel 
that having a specific entry point in your code is a matter of good 
practice (many do).

 
        <xsl:template match="*">
                <xsl:copy>
                        <xsl:copy-of select="@*" />
                        <xsl:apply-templates select="*" /> 
                </xsl:copy>
        </xsl:template>
  

To save yourself some keystrokes (also further on), you can as well 
write the above as follows:

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

In addition, this way (using node() instead of *), text nodes, 
processing instructions etc are also processed by your copy template.

 
        <xsl:template match="row[position() = 1 or 
preceding-sibling::*[name() != 'row' and position() = 1]]" >
                <table>
                        <xsl:apply-templates select="." mode="more2come"/>
                </table>
        </xsl:template>
  

Take a close look at the way Andrew coded this same principle. Also, 
consider an earlier remark by Justin about *not* using name() to compare 
nodes. Use self::row instead. This will help you when you are attempting 
sources that contain namespaces.

        <xsl:template match="row" mode="more2come">
                <xsl:copy>
                        <xsl:copy-of select="@*" />
  

The line above (xsl:copy-of) can be removed if you follow the remark 
made above about the copy template.

                        <xsl:apply-templates select="*" /> 
  

And this should really read:

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

to make it all work well.

                </xsl:copy>
                <xsl:if test="following-sibling::*[name() = 'row' and 
position() = 1]">
                        <xsl:apply-templates 
select="following-sibling::row[position() = 1]" mode="more2come" />
                </xsl:if>
  

Whenever you find yourself making an xsl:if with a node test, followed 
by an xsl:apply-templates with (largely) the same call, it is most 
likely that you can easily write it in one statement and make it clearer 
for you and fellow coders. Note that xsl:apply-templates does nothing 
when the selection contains an empty set, making the xsl:if from 
imperative programming style largely redundant.

See the code of Andrew for an example.


        </xsl:template>
 
        <xsl:template match="row" >
        </xsl:template>

Using the approach of Andrew, you do not need this delete-template, 
saving on keystrokes again ;)

If you want it simple and fast, I believe the approach with keys is 
quicker, but not necessarily so of course. In addition, since all you do 
is plain copying and no further processing, it is likely that the 
<xsl:copy-of> constructor from my example will work the fastest 
nonetheless. But I haven't seen your source, so I couldn't tell (and 
with an optimizing processor it may matter zero after all).

Cheers & happy coding ;)

-- Abel Braaksma

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--