我有一个模板:
<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>
答案 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>
模板可以同时包含match
和name
属性。如果同时设置两者,则可以xsl:apply-templates
和xsl:call-template
调用模板。