Если предположить, что контекст, в котором вызывается шаблон, является выбором дочернего узла , тогда я предлагаю следующее.Если контекст, в который они были вызваны, был через другую ось (скажем, предшествующий брат или родительский элемент), то путь к нему лучше всего подходит.
Две возможности - упростить тесты или заменить их другими шаблонами.:
Упрощенные тесты:
<xsl:template match="sect1">
<xsl:if test="position() = 1">
<!-- Special handling for first sect1 element goes here. -->
</xsl:if>
<!-- Common handling for all sect1 elements goes here. -->
<xsl:if test="position() = last()">
<!-- Special handling for last sect1 element goes here. -->
</xsl:if>
</xsl:template>
Различные шаблоны:
<xsl:template name="handleSect1">
<!-- Common handling for all sect1 elements goes here. -->
<xsl:template>
<xsl:template match="sect1">
<xsl:call-template name="handleSect1"/>
</xsl:template>
<xsl:template match="sect1[1]">
<!-- Special handling for first sect1 element goes here. -->
<xsl:call-template name="handleSect1"/>
</xsl:template>
<xsl:template match="sect1[last()]">
<xsl:call-template name="handleSect1"/>
<!-- Special handling for last sect1 element goes here. -->
</xsl:template>
<xsl:template match="sect1[position() = 1 and position() = last()]">
<!-- Special handling for first sect1 element goes here. -->
<xsl:call-template name="handleSect1"/>
<!-- Special handling for last sect1 element goes here. -->
</xsl:template>
Поскольку вы говорите "оптимизировать", я предполагаю, что вы заботитесь о том, что будет обрабатываться быстрее.Он будет варьироваться в зависимости от процессора xslt, режимов обработки (в некоторых есть опция «компилировать», и это будет влиять на более эффективную) и входного XML.Самым быстрым может быть либо один из них, либо ваш исходный.
Действительно, каждый из них должен быть столь же эффективным, как и другой, разница состоит в том, что процессору удается оптимизировать.
IЯ бы предпочел первый в моем ответе здесь, в данном случае, так как он является наиболее кратким, но если бы у меня не было общей обработки, разделяемой между всеми четырьмя случаями, я бы предпочел подход во втором ответе, который затем четко обозначает различные подходы длякаждый случай.