ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> xsl-list
xsl-list
RE: [xsl] Counting nodes efficiently
by Dimitre Novatchev other posts by this author
Feb 19 2004 10:41AM messages near this date
[xsl] Re: Resolving ambiguities when overriding the identity rule (Was: RE: [xsl] Counting nodes efficiently ) | RE: [xsl] Counting nodes efficiently
>  <xsl:stylesheet version="1.0"
>   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>   <xsl:output omit-xml-declaration="yes"/>
>   
>    <xsl:template match="@* | node()">
>      <xsl:copy>
>        <xsl:apply-templates select="@*"/>
>        <xsl:apply-templates select="node()[1]"/>
>      </xsl:copy>
>      <xsl:apply-templates select="following-sibling::node()[1]"/>
>    </xsl:template>
>  
>  </xsl:stylesheet>
>  
>  This transformation produces the same results as the more well-known
>  identity rule.
>  
>  The difference is that we now have the finest possible grain-level of
>  controll as every xsl:apply-templates instruction above always selects
>  at
>  most one node.
>  
>  It is trivial to add parameters and to override the one-at-a-time
>  identity
>  for elements. Thus we finally have:
>  
>  <xsl:stylesheet version="1.0"
>   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>   <xsl:output omit-xml-declaration="yes"/>
>   
>    <xsl:template match="@* | node()">
>      <xsl:param name="pnAncestors" select="0"/>
>      <xsl:param name="pnPreceding" select="0"/>
>      <xsl:copy>
>        <xsl:apply-templates select="@*"/>
>        <xsl:apply-templates select="node()[1]">
>          <xsl:with-param name="pnAncestors" 
>                          select="$pnAncestors+1"/>
>          <xsl:with-param name="pnPreceding"
>                          select="$pnPreceding"/>
>        </xsl:apply-templates>
>      </xsl:copy>
>      <xsl:apply-templates select="following-sibling::node()[1]">
>        <xsl:with-param name="pnAncestors" 
>                        select="$pnAncestors"/>
>        <xsl:with-param name="pnPreceding"
>                        select="$pnPreceding+1"/>
>            
>      </xsl:apply-templates>
>    </xsl:template>
>    
>    <xsl:template match="*">
>      <xsl:param name="pnAncestors" select="0"/>
>      <xsl:param name="pnPreceding" select="0"/>
>      
>      <xsl:copy>
>        <xsl:copy-of select="@*"/>
>        <xsl:attribute name="_id">
>          <xsl:value-of select=
>                      "concat(name(), '_',
>                              $pnAncestors, '_', 
>                              $pnPreceding 
>                              )"/>
>        </xsl:attribute>
>      </xsl:copy>
>      <xsl:apply-templates select="node()[1]">
>        <xsl:with-param name="pnAncestors" 
>                        select="$pnAncestors+1"/>
>        <xsl:with-param name="pnPreceding"
>                        select="$pnPreceding"/>
>      </xsl:apply-templates>
>      <xsl:apply-templates select="following-sibling::node()[1]">
>        <xsl:with-param name="pnAncestors" 
>                        select="$pnAncestors"/>
>        <xsl:with-param name="pnPreceding"
>                        select="$pnPreceding+1"/>
>            
>      </xsl:apply-templates>
>      
>    </xsl:template>
>  
>  </xsl:stylesheet>


Ooppss... 

The last but one xsl:apply-templates must be inside xsl:copy.

So, the correct override for elements is:

  <xsl:template match="*"> 
    <xsl:param name="pnAncestors" select="0"/> 
    <xsl:param name="pnPreceding" select="0"/> 
    
    <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:attribute name="_id"> 
        <xsl:value-of select=
                    "concat(name(), '_',
                            $pnAncestors, '_', 
                            $pnPreceding 
                            )"/> 
      </xsl:attribute> 
      <xsl:apply-templates select="node()[1]"> 
        <xsl:with-param name="pnAncestors" 
                        select="$pnAncestors+1"/> 
        <xsl:with-param name="pnPreceding"
                        select="$pnPreceding"/> 
      </xsl:apply-templates> 
    </xsl:copy> 
    <xsl:apply-templates select="following-sibling::node()[1]"> 
      <xsl:with-param name="pnAncestors" 
                      select="$pnAncestors"/> 
      <xsl:with-param name="pnPreceding"
                      select="$pnPreceding+1"/> 
          
    </xsl:apply-templates> 
    
  </xsl:template> 

Cheers,

Dimitre Novatchev 
FXSL developer,

http://fxsl.sourceforge.net/ -- the home of FXSL
Resume: http://fxsl.sf.net/DNovatchev/Resume/Res.html


__________________________________
Do you Yahoo!?
Yahoo! Mail SpamGuard - Read only the mail you want.
http://antispam.yahoo.com/tools

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list

Privacy Policy | Email Opt-out | Feedback | Syndication
© ActiveState Software Inc. All rights reserved