存储数据以供流式传输

问题描述

我正在尝试使用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>

由于单一的向下选择限制,我不能仅将{ReusableData} copy-of变成变量。我想象蓄能者会来这里比赛,但我无法理解它们。我看到的示例使用具有原始类型的映射,由于参考数据包含其他元素,因此我至少需要存储部分节点集。

解决方法

对于撒克逊人来说,扩展属性saxon:capture(请参阅https://www.saxonica.com/html/documentation/extensions/attributes/capture.html)应该会有所帮助:

如果大型文档的标题部分较短,其中包含元数据, 您可以在累加器中捕获标头的副本,并且标头 然后在其余所有文档处理过程中可用 使用accumulator-after()函数

,

应该简单

        var conn = dbConn as SqlConnection;
        conn.ConnectTimeout = 500;
        conn.StatisticsEnabled = true;

        try
        {
            using (var command = new SqlCommand(query,conn))
            {
                command.CommandTimeout = 1;
                using (var adapter = new SqlDataAdapter(command))
                {
                    var rowsCount = adapter.Fill(startIdx,MaxRows,new DataTable[] { dtResult });
                    var stats = conn.RetrieveStatistics();
                    long commandExecutionTimeInMs = (long)stats["ExecutionTime"];
                    long commandNetworkServerTimeInMs = (long)stats["NetworkServerTime"];
                    Console.Writeline("Command statistics execution time: " + commandExecutionTimeInMs.ToString());
                    Console.Writeline("Command statistics network server time: " + commandNetworkServerTimeInMs.ToString());
                    conn.ResetStatistics();
                    conn.StatisticsEnabled = false;
                    return rowsCount;
                }
            }
        }
        catch (Exception ex)
        {
            var stats = conn.RetrieveStatistics();
            long commandExecutionTimeInMs = (long)stats["ExecutionTime"];
            long commandNetworkServerTimeInMs = (long)stats["NetworkServerTime"];
            Console.Writeline("Command statistics execution time: " + commandExecutionTimeInMs.ToString());
            Console.Writeline("Command statistics network server time: " + commandNetworkServerTimeInMs.ToString());
            conn.ResetStatistics();
            conn.StatisticsEnabled = false;
        } 

然后再

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...