valor passe de um para cada jogo para o próximo: XSLT
Pergunta
Estou usando o seguinte para coincidir com todos os <section>
s com um conjunto de atributos de revisão. <section>
can aparecem em muitos níveis diferentes da árvore de documentos, sempre contido dentro <chapter>
s.
<xsl:for-each select="//section[@revision]">
<!-- Do one thing if this is the first section
matched in this chapter -->
<!-- Do something else if this section is in the same
chapter as the last section matched -->
</xsl:for-each>
Como os comentários dizer, eu preciso fazer cada iteração for-each
ciente do capítulo para o qual o seção combinado anterior pertencia. Eu sei que <xsl:variable>
s são realmente estática, uma vez definido, e que <xsl:param>
aplica-se apenas a chamar modelos.
Esta sendo Docbook, posso recuperá número do capítulo de uma seção com:
<xsl:apply-templates select="ancestor::chapter[1]" mode="label.markup" />
mas eu acho que pode ser feito com puramente XPath.
Todas as idéias? Obrigado!
Solução
Não tenho certeza se eu unterstood suas necessidades 100%, mas ...
<xsl:variable name="sections" select="//section[@revision]" />
<xsl:for-each select="$sections">
<xsl:variable name="ThisPos" select="position()" />
<xsl:variable name="PrevMatchedSection" select="$sections[$ThisPos - 1]" />
<xsl:choose>
<xsl:when test="
not($PrevMatchedSection)
or
generate-id($PrevMatchedSection/ancestor::chapter[1])
!=
generate-id(ancestor::chapter[1])
">
<!-- Do one thing if this is the first section
matched in this chapter -->
</xsl:when>
<xsl:otherwise>
<!-- Do something else if this section is in the same
chapter as the last section matched -->
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
No entanto, eu suspeito que esta coisa toda pode ser resolvido de forma mais elegante com uma abordagem <xsl:template>
/ <xsl:apply-templates>
. Mas sem ver a sua entrada e saída esperada isso é difícil de dizer.
Outras dicas
position () irá retornar a sua posição dentro da atual para-cada iteração. A primeira iteração, IIRC, retornará 0, então testar para "position () = 0" vai dizer se você está na primeira iteração.