George of SSI
George of SSI

Reputation: 3

How to use xsl:number count as condition in xsl:if test "condition"?

Within an xsl:for-each select loop, I have <xsl:number count="//headline"/> that correctly gives me the node #; Now I want to use that number in an xsl:if test block, but I cannot get the test expression right, msxml4.dll keeps kicking back errors. Am using xsl 1.0 (and stuck with it for now)

So, in <xsl:if test="expression">...output if the expression is true..</xsl:if>

I want the test expression to essentially be like this (so I can do something specific for Node #4, in this example):

<xsl:number count="//headline"/> = 4

This is what I have that does not work:

<xsl:if test="&lt;xsl:number count=&quot;//headline&quot;/&gt; = 4">

Thanks in advance for any insights, George

Upvotes: 0

Views: 10899

Answers (2)

Michael Kay
Michael Kay

Reputation: 163322

As @michael.hor257k explains, the general approach is to put the xsl:number call inside an xsl:variable (or in XSLT 2.0, inside an xsl:function). Sometimes though it's more convenient to abandon xsl:number:

<xsl:if test="count(preceding::headline) = 3">...</xsl:if>

If it's a big document then both xsl:number and preceding::headline are potentially expensive when executed inside a loop, and if this is a concern then you should compare them under your chosen XSLT processor: one may be optimized better than the other.

Come to think of it, your use of xsl:number looks odd to me. The count attribute is a pattern, and the pattern //headline matches exactly the same nodes as the pattern headline. As a result I misread your call on xsl:number as counting all the headlines in the document, whereas it actually only counts the preceding-sibling headlines. I wonder if that is what you intended?

Upvotes: 1

michael.hor257k
michael.hor257k

Reputation: 116992

If (!) I understand correctly, you want to do something like:

<xsl:variable name="n">
    <xsl:number count="headline"/>  
</xsl:variable>
<xsl:value-of select="$n"/>
<xsl:if test="$n = 4">
    <!-- do something -->
</xsl:if>

Upvotes: 1

Related Questions