我正在使用以下内容将所有<section>
与版本属性集匹配。 <section>
可以出现在文档树的许多不同级别,始终包含在<chapter>
中。
<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>
正如评论所说,我需要让每个for-each
次迭代都知道上一个匹配部分所属的章节。我知道<xsl:variable>
一旦设置就是静态的,<xsl:param>
仅适用于调用模板。
这是Docbook,我可以通过以下方式检索章节的章节编号:
<xsl:apply-templates select="ancestor::chapter[1]" mode="label.markup" />
但我认为可以用纯XPath完成。
有什么想法吗?谢谢!
答案 0 :(得分:1)
不确定我是否100%理解您的要求,但是......
<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>
但是,我怀疑使用<xsl:template>
/ <xsl:apply-templates>
方法可以更优雅地解决这一问题。但是,如果没有看到您的输入和预期输出,这很难说。
答案 1 :(得分:0)
position()将返回当前for-each迭代中的位置。第一次迭代IIRC将返回0,因此测试“position()= 0”将告诉您是否处于第一次迭代中。