【发布时间】:2020-07-13 14:10:55
【问题描述】:
要完成来自previous question 的任务,我还需要在转换完成后计算我得到的文档的某些元素。
通常,在处理小文档时,可以将初始输出放入一个变量,然后对其应用模板,类似于
<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 并且已经写了一个允许我计算 source 文档中的某些元素,但现在我卡住了,不知道如何在 中执行这样的元素计数>结果文档,有人可以帮帮我吗?
【问题讨论】:
-
我认为在一次转换中没有办法做到这一点,您需要链接两个转换并在第二次转换中使用累加器。应该可以通过 API 使用saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/… 进行链接转换。
标签: xslt saxon xslt-3.0 accumulator