我的任务是从一些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)
但这产生了同样的结果.
有任何想法吗?也许某些东西不是两遍变换?任何帮助将不胜感激.
两遍方法是一种更符合逻辑、更稳健的方法。
一次性方法非常具有挑战性。可以在的属性中提供一个表达式,并且可以使用该表达式将“本地数字”与迄今为止所有先前文档中的最大累积数字相加。value
<xsl:number>
然而,这需要对文档进行排序(这在函数式语言中是不好的),并且这只适用于平面编号方案。如果使用分层编号(3.4.2),我没有看到从上一个文档的最大编号继续的简单方法。
出于这种考虑,我肯定会在编号之前将所有文档合并为一个。