XSLT: Pass Wert von einer foreach-Spiel auf die nächste
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!
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.