Frage

Ich verwende die folgenden alle <section>s gesetzt mit einer Revision Attribut übereinstimmen. auf vielen verschiedenen Ebenen des Dokumentbaums erscheinen <section>can, immer innerhalb <chapter>s enthalten ist.

<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>

Wie die Kommentare sagen, muss ich jede for-each Iteration bewusst machen, das Kapitel zu dem die zurück angepasst Abschnitt gehörte. Ich weiß, dass <xsl:variable>s einmal Satz tatsächlich statisch sind, und dass <xsl:param> gilt nur für Vorlagen aufrufen.

Dieses Wesen Docbook, ich kann eine Kapitelnummer des Abschnitts retreive mit:

<xsl:apply-templates select="ancestor::chapter[1]" mode="label.markup" />

aber ich denke, es kann mit rein XPath erfolgen.

Irgendwelche Ideen? Dank!

War es hilfreich?

Lösung

Nicht sicher, ob ich Ihre Anforderungen zu 100% unterstood, aber ...

<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>

Aber ich vermute, dass das Ganze mehr elegant mit einem <xsl:template> / <xsl:apply-templates> Ansatz gelöst werden kann. Aber ohne Ihre Eingabe und erwartete Ausgabe zu sehen, das ist schwer zu sagen.

Andere Tipps

position () wird Ihre Position innerhalb der aktuellen for jeder Iteration zurück. Die erste Iteration, IIRC, 0 zurück, so die Prüfung für "Position () = 0" werden Ihnen sagen, wenn Sie in der ersten Iteration sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top