Sakthivel
Sakthivel

Reputation: 666

XSLT template matching on //

The following xslt code produces the output incorrectly. Actually, it should increment the values by 1, But, It produces increment by 2. I need to get this know why. Could anyone let me know why this?

the xml input is

<AAA>
    <BBB>cc </BBB>
    <BBB>ff </BBB>
  <BBB>aa </BBB>
   <BBB>fff </BBB>
   <BBB>FFF </BBB>
  <BBB>Aa </BBB>
  <BBB>ccCCC </BBB>
</AAA>

and the xslt input code is

<xsl:template match="/">
<xsl:text>
BBB[</xsl:text>
<xsl:value-of select="position()"/>
<xsl:text>]: </xsl:text>
<xsl:value-of select="."/>
</xsl:template>

It produces the output as follows [wrongly], but it should provide such as [1], [2], [3] etc.

BBB[2]: cc 
BBB[4]: ff 
BBB[8]: aa 
BBB[10]: fff 
BBB[12]: FFF 
BBB[14]: Aa 
BBB[16]: ccCCC

Any idea?

Upvotes: 0

Views: 60

Answers (1)

Martin Honnen
Martin Honnen

Reputation: 167781

I am pretty sure if you only have <xsl:template match="/"> that then you won't even get the output you say you get. Assuming you have

<xsl:template match="BBB">
<xsl:text>
BBB[</xsl:text>
<xsl:value-of select="position()"/>
<xsl:text>]: </xsl:text>
<xsl:value-of select="."/>
</xsl:template>

then the result depends on other factors like whether you have <xsl:strip-space elements="*"/> or whether you use

<xsl:template match="AAA">
  <xsl:apply-templates select="*"/>
</xsl:template>

Your current result you have suggests you are not stripping white space text nodes and you either rely on built-in templates or you have <xsl:apply-templates/> or <xsl:apply-templates select="node()"/> in the template matching AAA. That way the current node list contains both element node as well as text nodes (between element nodes) resulting in your position results 2, 4, 6, ...

I would fix the code with

<xsl:template match="BBB">
<xsl:text>
BBB[</xsl:text>
<xsl:number/>
<xsl:text>]: </xsl:text>
<xsl:value-of select="."/>
</xsl:template>

Upvotes: 1

Related Questions