Specific template for the first item
I have a template:
<xsl:template match="paragraph"> ... </xsl:template> I call it:
<xsl:apply-templates select="paragraph"/> For the first item I need to do:
<xsl:template match="paragraph[1]"> ... <xsl:apply-templates select="."/><!-- I understand that this does not work --> ... </xsl:template> How to call <xsl:apply-templates select="paragraph"/> (for the first paragraph element) from a template <xsl:template match="paragraph[1]"> ?
So far I have something like a loop.
I solve this problem like this (but I don't like it):
<xsl:for-each select="paragraph"> <xsl:choose> <xsl:when test="position() = 1"> ... <xsl:apply-templates select="."/> ... </xsl:when> <xsl:otherwise> <xsl:apply-templates select="."/> </xsl:otherwise> </xsl:choose> </xsl:for-each> One way to do this is to use a named template and have both the first and other paragraphs invoking that named template.
<xsl:template match="Paragraph[1]"> <!-- First Paragraph --> <xsl:call-template name="Paragraph"/> </xsl:template> <xsl:template match="Paragraph"> <xsl:call-template name="Paragraph"/> </xsl:template> <xsl:template name="Paragraph"> <xsl:value-of select="."/> </xsl:template> Another way is to invoke apply templates separately for the first paragraph and other paragraphs.
<!-- First Paragraph --> <xsl:apply-templates select="Paragraph[1]"/> <!-- Other Paragraphs --> <xsl:apply-templates select="Paragraph[position() != 1]"/> Name the common paragraph pattern, then call it by name from the paragraph[1] pattern paragraph[1] :
<xsl:template match="paragraph" name="paragraph-common"> ... </xsl:template> <xsl:template match="paragraph[1]"> ... <xsl:call-template name="paragraph-common"/> ... </xsl:template> A template can have both a match attribute and a name attribute. If you set both parameters, you can call the template as xsl:apply-templates and xsl:call-template .