RE: [xsl] Bad practice

Subject: RE: [xsl] Bad practice
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 8 Apr 2005 16:13:50 +0100
> I hope this message gets to the list, cause my last fews 
> seems that don't. 

You last message got there (twice), but for some reason no-one answered it.
> 
> What are the consequences of a construction like this in terms of
> performance, and what about coding style?
> 
> I'm creating a table like this where diasemana.xml is a xml
> representation of week days:
> 
> 			<table id="{$t}" border="1">
> 				<th>Processo</th>
> 				<xsl:for-each 
> select="document('diassemana.xml')/dias/dia">
> 					<th>
> 						<xsl:value-of 
> select="@txt"/>
> 					</th>
> 				</xsl:for-each>
> 				<xsl:apply-templates 
> select="/GHoras/Processos/Processo"/>
> 			</table>
> 
> 	<xsl:template match="Processo">
> 		<tr prK="{Processo_K}">
> 			<xsl:variable name="this" select="."/>
> 			<td>
> 				<xsl:value-of select="NomeProcesso"/>
> 			</td>
> 			<xsl:for-each 
> select="document('diassemana.xml')/dias/dia">
> 				<xsl:variable name="pos" 
> select="position()"/>
> 				<xsl:for-each select="$this">
> 					<xsl:call-template 
> name="edhoras">
> 						<xsl:with-param 
> name="dia" select="$pos"/>
> 					</xsl:call-template>
> 				</xsl:for-each>
> 			</xsl:for-each>
> 		</tr>
> 	</xsl:template>
> 
> This second use of document() serves only to do a 7th time loop,
> without using any data, and the nested for-each is simply to change
> context.
> 
> Is this a bad practice?

No, not especially. But when a named template is dependent on the context
node, it can often be better to make it a match template instead, perhaps
with a specific mode. Then you could replace 

<xsl:for-each select="document('diassemana.xml')/dias/dia">
  <xsl:variable name="pos" select="position()"/>
  <xsl:for-each select="$this">
      <xsl:call-template name="edhoras">
        <xsl:with-param name="dia" select="$pos"/>
      </xsl:call-template>
  </xsl:for-each>
</xsl:for-each>

with

<xsl:for-each select="document('diassemana.xml')/dias/dia">
  <xsl:apply-templates select="$this" mode="edhoras">
    <xsl:with-param name="dia" select="position()"/>
  </
</

Michael Kay
http://www.saxonica.com/

Current Thread