首页 > 解决方案 > 使用带有流的 XSLT 转换文档后计数元素

问题描述

为了完成上一个问题中的任务,我还需要计算完成转换后获得的文档的某些元素。
通常,在处理小文档时,可以将初始输出放入一个变量,然后对其应用模板,例如

<xsl:template match=/*>
    <xsl:variable name="phase1">
        <Transformed>
            ...
        </Transformed>
    </xsl:variable>

    <xsl:apply-templates mode="step2" select="$phase1/*"/>

</xsl:template>

<xsl:template match="node() | @*" mode="step2">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*" mode="step2"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/Transformed/DocumentTotal/text()" mode="step2">
   <xsl:value-of select="count(/Transformed//*[some predicate here]"/>
</xsl:template>

但是我必须能够处理大型文档,所以我既不想将结果复制到变量中,也不想以非流模式处理它。我看了看,<xsl:accumulator已经写了一个允许我计算文档中的某些元素,但是现在我卡住了,不知道如何对结果文档中的元素进行这样的计数,有人可以帮我吗?

标签: xsltsaxonxslt-3.0accumulator

解决方案


有很多技术可以做到这一点,但没有一个特别令人满意。他们包括:

(a) 在输出文档上运行另一遍: (a1) 在同一个 XSLT 样式表中,使用第二个 XSLT 样式表 (a3) 中的变量 (a2),使用 XSLT 以外的一些技术,例如后处理 SAX 过滤器

(b) 对输入文档运行一些计算,计算出结果中将出现多少项目,而与实际产生这些结果无关。当然,这些的可行性根据实际情况有很大差异。

(c) 使用一些处理器扩展,允许您增加计数器作为生成输出项的副作用(例如 saxon:assign - 这是保留该指令的主要用例)。


推荐阅读