存储流式传输期间使用的数据
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"/>
我正在尝试使用 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"/>