Uploaded image for project: 'XalanJ2'
  1. XalanJ2
  2. XALANJ-2324

XPath function last() gives wrong result when select has a predicate

    XMLWordPrintableJSON

Details

    Description

      Here is the testcase, the input XML is this:
      <?xml version="1.0" encoding="UTF-8"?>
      <project>
      <author>
      <firstname>Bugs</firstname>
      <initial>B</initial>
      <lastname>Gone</lastname>
      </author>
      </project>

      The stylesheet is this:
      <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="text" encoding="UTF-8"/>

      <xsl:template match="author">
      <xsl:for-each select='(child::*)[not(self::initial)]'>
      Child element <xsl:value-of select="position()"/>
      of <xsl:value-of select="last()"/>
      Element name: <xsl:value-of select="name()"/>
      </xsl:for-each>
      </xsl:template>
      </xsl:stylesheet>

      The current, and incorrect output is this:
      Child element 1
      of 3
      Element name: firstname
      Child element 2
      of 3
      Element name: lastname

      The selected elements are correct, but the last() function is returning 3 rather than 2.
      If the for-each is changed to this:
      <xsl:for-each select='(child::*)[not(self::junk)]'>
      it iterates over the 3 children correctly (there is no child named 'junk' so the predicate does not reduce the sequence selected by (child::*), but in this case last() returns 4. In both cases one greater than it should.

      With no predicate things work fine.

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              minchau@ca.ibm.com Brian Minchau
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: