Specific template for the first element
optimization, xslt
Solution
One way to do this could be to make use of a named template, and have both the first and other paragraphs calling this 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 call 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]"/>
Problem
I have a template: ``` <xsl:template match="paragraph"> ... </xsl:template> ``` I call it: ``` <xsl:apply-templates select="paragraph"/> ``` For the first element 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 element `paragraph`) from the template `<xsl:template match="paragraph[1]">`? So far that I have something like a loop. I solve this problem so (but I do not 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> ```