У меня есть шаблон:
<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>
Одним из способов сделать это может быть использование именованного шаблона, и чтобы и первый, и другие абзацы вызывали этот именованный шаблон.
<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]
шаблона:
<xsl:template match="paragraph" name="paragraph-common">
...
</xsl:template>
<xsl:template match="paragraph[1]">
...
<xsl:call-template name="paragraph-common"/>
...
</xsl:template>
Шаблон может иметь как соответствие
, так и атрибут имя
. Если вы установите оба параметра, вы можете вызвать шаблон как с помощью xsl: apply-templates
, так и с помощью xsl: call-template
.