问题描述
我正在尝试使用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>