第一个元素的特定模板

时间:2010-05-19 07:23:18

标签: xslt optimization

我有一个模板:

<xsl:template match="paragraph">
    ...
</xsl:template>

我称之为:

<xsl:apply-templates select="paragraph"/>

对于我需要做的第一个元素:

<xsl:template match="paragraph[1]">
    ...
    <xsl:apply-templates select="."/><!-- I understand that this does not work -->
    ...
</xsl:template>

如何从模板<xsl:apply-templates select="paragraph"/>拨打paragraph(第一个元素<xsl:template match="paragraph[1]">)?

到目前为止,我有类似循环的东西。


我解决了这个问题(但我不喜欢):

<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>

2 个答案:

答案 0 :(得分:6)

这样做的一种方法是使用命名模板,并让第一段和其他段落都调用此命名模板。

<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>

另一种方法是分别为第一段和其他段落调用apply-templates

  <!-- First Paragraph -->
  <xsl:apply-templates select="Paragraph[1]"/>

  <!-- Other Paragraphs -->
  <xsl:apply-templates select="Paragraph[position() != 1]"/>

答案 1 :(得分:2)

为您的通用paragraph模板命名,然后通过paragraph[1]模板中的名称调用它:

<xsl:template match="paragraph" name="paragraph-common"> 
    ... 
</xsl:template>

<xsl:template match="paragraph[1]">
    ...
    <xsl:call-template name="paragraph-common"/>
    ...
</xsl:template>

模板可以同时包含matchname属性。如果同时设置两者,则可以xsl:apply-templatesxsl:call-template调用模板。