存储流式传输期间使用的数据

Storing data for use during streaming

我正在尝试使用 XSLT3 流式传输 XML 文件。它有许多构成“可重用”数据的标签,这些标签将需要在处理重复数据(流式处理的地方)期间使用。

<Root>
    <ReusableData1>
        <ReferenceData id="1">
            <a/>
            <b/>
        </ReferenceData>
        <ReferenceData id="2">
            <a/>
            <b/>
        </ReferenceData>
    </ReusableData1>
    <RepeatingData>
        <RefId>1</RefId>
    </RepeatingData>
    <RepeatingData>
        <RefId>2</RefId>
    </RepeatingData>
 ...
</Root>

由于单个向下选择限制,我不能只copy-of将 ReusableData 放入变量中。我想象累加器来这里玩,但我无法理解它们。我看到的示例使用原始类型的映射,我需要至少存储部分节点集,因为参考数据包含其他元素。

对于 Saxon,有扩展属性 saxon:capture,请参阅 https://www.saxonica.com/html/documentation/extensions/attributes/capture.html,应该有帮助:

If a large document has a short header section containing metadata, you can capture a copy of the header in an accumulator, and the header then becomes available throughout the rest of the document processing using the accumulator-after() function

应该像

一样简单
<xsl:accumulator name="reusable-data" as="element(ReusableData1)">
  <xsl:accumulator-rule match="ReusableData1" select="." saxon:capture="yes"/>
</xsl:accumulator>

之后

<xsl:value-of select="accumulator-after('reusable-data')/ReferenceData[@id='1']/a"/>