XSLT value () and position () give invalid indexes

Can someone explain to me why I get the following output by applying the following xsl file to the XML file.

<?xml version="1.0" encoding="ISO-8859-1"?>
<source>    
    <number>1</number> 
    <number>2</number> 
    <number>3</number> 
    <number>4</number> 
    <number>5</number> 
    <number>6</number> 
    <number>7</number> 
    <number>8</number> 
</source>

======================================

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="number">
   <p>
   <xsl:value-of select="position()"/>
   <xsl:text> of </xsl:text>
   <xsl:value-of select="last()"/>
   </p>
</xsl:template>
</xsl:stylesheet>

========================================

<p>2 of 17</p> 
    <p>4 of 17</p> 
    <p>6 of 17</p> 
    <p>8 of 17</p> 
    <p>10 of 17</p> 
    <p>12 of 17</p> 
    <p>14 of 17</p> 
    <p>16 of 17</p> 

I do not quite understand why the output is not 1 out of 8, 2 out of 8, etc.

+4
source share
3 answers

Try adding strip space as shown below:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  <xsl:strip-space elements="*"/>
  <xsl:template match="number">
   <p>
   <xsl:value-of select="position()"/>
   <xsl:text> of </xsl:text>
     <xsl:value-of select="last()"/>
   </p>
</xsl:template>
</xsl:stylesheet>

This gives the following result:

<p>1 of 8</p>
<p>2 of 8</p>
<p>3 of 8</p>
<p>4 of 8</p>
<p>5 of 8</p>
<p>6 of 8</p>
<p>7 of 8</p>
<p>8 of 8</p>

This is due to problems with spaces as described in this document. Basically, a set of nodes contains whitespace nodes that do not match your pattern, but contribute to the index of each node.

+2
source

@ColinE. , . strip-space.

node () xsl:for-each, , number. , .

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method="xml" omit-xml-declaration="yes"/>

<xsl:template match="source">
  <xsl:for-each select="number">
     <p>
        <xsl:value-of select="position()"/>
        <xsl:text> of </xsl:text>
        <xsl:value-of select="last()"/>
     </p>
     <xsl:text>&#10;</xsl:text>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

:

<p>1 of 8</p>
<p>2 of 8</p>
<p>3 of 8</p>
<p>4 of 8</p>
<p>5 of 8</p>
<p>6 of 8</p>
<p>7 of 8</p>
<p>8 of 8</p>

, strip-space :

<source><number>1</number><number>2</number><number>3</number><number>4</number><number>5</number><number>6</number><number>7</number><number>8</number></source>

, XML, , , , ColinE .

+3

- xsl: number. , position(). ( xsl:number , .)

:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

    <xsl:template match="number">
        <p>
            <xsl:number/>
            <xsl:text> of </xsl:text>
            <xsl:value-of select="../number[last()]"/>
        </p>
    </xsl:template>

</xsl:stylesheet>
0
source

All Articles