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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top