XSLT编号仅计算多文件文档的当前文件中的实例

fal*_*tro 6 xslt

我的任务是从一些XML文件中整理一本书(使用XSL FO),现在我正在尝试编写本书中的数字(简单的编号,章节中没有重置或其他),我天真的方法是这样做的

<xsl:template match="figure">
  <fo:block xsl:use-attribute-sets="figure">
    .. stuff to deal with images ..
    <fo:block xsl:use-attribute-sets="figure-caption">
      Figure <xsl:number level="any"/>: <xsl:apply-templates/>
    </fo:block>
  <fo:block xsl:use-attribute-sets="figure-caption">
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

我有一个聚合XML文件,使用这样的document()函数选择要使用的文件:

<xsl:template match="include">
  <xsl:apply-templates select="document(@src)"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是number似乎总是只计算当前文件中的实例,这不是我想要的(目前,每个文件只有一个或两个图像,导致所有数字都是'图1'或'图2' ).

我考虑过两种方法,基本上都是两遍XSLT.首先,直截了当的方法是使用身份变换生成包含整本书的中间XML,由于其他原因我不愿意这样做.

第二,使用node-set()扩展,我试过这样的

<xsl:template match="include">
  <xsl:apply-templates select="ext:node-set(document(@src))"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

但这产生了同样的结果.

有任何想法吗?也许某些东西不是两遍变换?任何帮助将不胜感激.

Dim*_*hev 3

两遍方法是一种更符合逻辑、更稳健的方法。

一次性方法非常具有挑战性。可以在的属性中提供一个表达式,并且可以使用该表达式将“本地数字”与迄今为止所有先前文档中的最大累积数字相加。value<xsl:number>

然而,这需要对文档进行排序(这在函数式语言中是不好的),并且这只适用于平面编号方案。如果使用分层编号(3.4.2),我没有看到从上一个文档的最大编号继续的简单方法。

出于这种考虑,我肯定会在编号之前将所有文档合并为一个。