【问题标题】:Count elements after the document gets transformed using XSLT with streaming使用带有流的 XSLT 转换文档后计数元素
【发布时间】: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>

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

【问题讨论】:

标签: xslt saxon xslt-3.0 accumulator


【解决方案1】:

对此有多种技术,但没有一种特别令人满意。它们包括:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2014-11-03
    • 2012-03-11
    • 1970-01-01
    相关资源
    最近更新 更多