xsl-list
[Top] [All Lists]

RE: debugging source line numbers

2003-01-22 01:36:19

"Roger Glover" <glover_roger(_at_)yahoo(_dot_)com> 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(_at_)yahoo(_dot_)com

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



<Prev in Thread] Current Thread [Next in Thread>