RE: [xsl] debugging source line numbers

Subject: RE: [xsl] debugging source line numbers
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Wed, 22 Jan 2003 00:36:19 -0800 (PST)
"Roger Glover" <glover_roger@xxxxxxxxx> wrote:
> 
> Dimitre Novatchev wrote:
> > In case preserving of whitespace-only nodes has not been turned off
> and
> > the xml source has "a single tag with all attributs/namespace
> > definitions" on a single line, then the following gives the exact
> line
> > number:
> >
> > count(preceding::text()[contains(., '
')]) + 1
> 
> This counts text nodes, not line feeds.  If a text node has more than
> one
> line feed it will still only count as one text node in the final
> result.
> 
> I think it is on the right track, but it does not quite work as
> currently
> written.
> 
> -- Roger Glover
>    glover_roger@xxxxxxxxx

Yes, too sleepy this morning... (:o


Here's the transformation, which does what was initially intended:

<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 
  <xsl:output method="text"/>
 
  <xsl:template match="*">
    <xsl:variable name="vPrevText">
      <x>
        <xsl:copy-of 
        select="preceding::text()[contains(., '&#xA;')]"/>
        
        <xsl:for-each select="preceding::comment()
                                 [contains(., '&#xA;')]">
          <xsl:value-of select="."/>
        </xsl:for-each>
        
        <xsl:for-each 
         select="preceding::processing-instruction()
                                  [contains(., '&#xA;')]">
          <xsl:value-of select="."/>
        </xsl:for-each>
      </x>
    </xsl:variable>
    
    <xsl:variable name="vLineNo" 
     select="string-length($vPrevText) + 1
            -
             string-length(translate($vPrevText, '&#xA;', ''))"/>
    
    <xsl:value-of select="concat(name(), 
                                 ' : line ', 
                                 $vLineNo, 
                                 '&#xA;')"/>
    
    <xsl:apply-templates/>
  </xsl:template>
  
  <xsl:template match="node()[not(self::*)]"/>
</xsl:stylesheet>

It also takes care of multiline comments / processing-instructions.

When applied on this source.xml:

<root>
  <item>1</item>
  <!-- -->
  <!-- 
        -->
  <item>5</item>
  <item>3</item>
  <item>2</item>
  <item>6</item>
  <item>4</item>
</root>

The result is:

root : line 1
item : line 2
item : line 6
item : line 7
item : line 8
item : line 9
item : line 10





=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL

__________________________________________________
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
http://mailplus.yahoo.com

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


Current Thread