1

如果有人能帮我解决这个问题,我会用烘焙食品奖励你!!

.NET 中的撒克逊人

我知道如何在流中运行 XSLT 转换。不是问题。我现在要做的只是从代表一个巨大的 xml 文档的流中获取一个节点。我开始:

var xpath=@"/x/ns1:y/ns2:z";
var myStream = System.IO.File.OpenRead("c:\superHuge.xml");

XdmValue nodeZ=null;

/// now I need to find nodeZ by evaluating xpath over the XML
/// coming in over myStream

我知道我可以尝试动态生成某种 XSLT 转换,使用将针对流运行的表达式“xpath”并生成包含结果节点集的结果文档。但是对于我的实现来说,这真的很臭。我需要能够开始一个接一个地向流中抛出一堆 xpath 表达式并获得结果节点。

有谁知道如何用 Saxon EE 做到这一点?如果不能,是否有其他产品可以支持它?

4

1 回答 1

3

您可能会发现解决此问题的最佳方法是将 Saxon 的 XQuery 与文档投影结合使用。本质上,这是通过过滤来自 XML 解析器的事件流并构建一个仅包含对查询结果有贡献的节点的树来工作的。XQuery 在这方面比 XSLT 工作得更好,因为它更适合静态分析,因为它缺乏 XSLT 模板规则的多态性。

一个奇怪的巧合是,我的同事 O'Neil Delpratt 一直致力于 .NET API 的测试用例,今天发现没有使用该 API 调用 XQuery 文档投影的直接方法。不过看一下,然后从命令行或 Java 中尝试一下;我确信它可以在 .NET 中完成,它可能只需要比公共 API 更深入一点。

要使用 XSLT 做同样的事情,我认为您必须以编程方式生成样式表。它不一定很复杂:像

<xsl:mode streamable="yes"/>

<xsl:template match="/">
  <xsl:copy-of select="---your path here---"/>
</xsl:template>
于 2013-09-10T20:36:57.583 回答