天道酬勤,学无止境

XSLT 3.0 streaming (Saxon)

I have a big XML file (6 GB) with this kind of tree:

<Report>
   <Document>
      <documentType>E</documentType>
      <person>
         <firstname>John</firstname>
         <lastname>Smith</lastname>
      </person>
   </Document>
   <Document>
      [...]
   </Document>
   <Document>
      [...]
   </Document>
   [...]
</Report>

If I apply an XSLT style sheet on it, I have this error:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

So I wanted to try the new XSLT 3.0 feature: streaming, with Saxon 9.6 EE. I don't want to have the streaming constrains once in a Document. I think that, what I want to do, is very close to the "burst mode" that is described here: http://saxonica.com/documentation/html/sourcedocs/streaming/burst-mode-streaming.html

Here is my Saxon command line:

java -cp saxon9ee.jar net.sf.saxon.Transform -t -s:input.xml -xsl:stylesheet.xsl -o:output/output.html

Here is my XSLT style sheet:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:mode streamable="yes" />

<xsl:template match="/">
    GLOBAL HEADER
        <xsl:iterate select="copy-of()/Report/Document" >
           DOC HEADER
           documentType: <xsl:value-of select="documentType"/>
           person/firstname: <xsl:value-of select="person/firstname"/>
           DOC FOOTER
           <xsl:next-iteration/>
        </xsl:iterate>
    GLOBAL FOOTER
</xsl:template>

</xsl:stylesheet>

But I still have the same out of memory error.

Thank you for your help!

评论

Your copy-of() is copying the context item, which is the entire document. You want

copy-of(/Report/Document)

which copies each Document in turn. Or I tend to write it

/Report/Document/copy-of()

because I think it makes it clearer what is going on.

Incidentally you don't need xsl:iterate here: xsl:for-each will do the job perfectly well, because processing of one Document doesn't depend on the processing of any previous documents.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 什么是最高效的基于Java的流XSLT处理器? [关闭](What is the Most Efficient Java-Based streaming XSLT Processor? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 5年前关闭。 改善这个问题 我有一个非常大的XML文件,需要将其转换为另一个XML文件,并且我想使用XSLT做到这一点。 我对内存优化而不是速度优化更感兴趣(尽管速度也不错!)。 您将推荐使用哪个基于Java的XSLT处理器? 您是否会推荐其他方法(非XSLT,非Java?),如果可以,为什么? 问题中的XML文件很大,但不是很深-有数百万行(元素),但只有大约3个级别。 回答1 目前,只有三个已知的XSLT 2.0处理器,从速度和内存利用率两方面来看,Saxon 9.x可能是最高效的(至少根据我的经验)。 Saxon-SA ( Saxon的模式识别版本,由于B(基本)版本不是免费的)具有用于流处理的特殊扩展。 从各种现有的XSLT 1.0处理器中,.NET XslCompiledTransform (基于C#,而不是Java!)似乎是冠军。 在XSLT 1.0处理器的基于Java的世界中, Saxon 6.x再次非常出色。 更新: 现在,从最初回答这个问题的日期开始已有3年多的时间,没有任何证据表明所提到的XSLT处理器之间的效率差异已经改变。 至于流媒体: 即使没有任何流,也可以很好地处理带有“数百万个节点”的XML文档。 我进行了一个实验
  • Node.js 是 XSLT 2.0 还是 3.0?(XSLT 2.0 or 3.0 for Node.js?)
    问题 我一直在寻找通过 XSLT 支持 XML 到 HTML/XSL 2.0 版转换的节点模块。 我仅限于在 Windows 环境中进行开发,并且研究了许多替代方案,包括 Saxon/C (saxon-node)、node_xslt、gulp-xslt 和其他一些。 我还没有找到满足我们需求的解决方案。 大多数解决方案似乎都需要 linux 或 mac osx 环境进行开发。 有任何想法吗? 我非常感谢提前的帮助! 回答1 2020 更新 Saxon-JS 2 现在在 Node.js 和浏览器中支持 XSLT 3.0! 以前的答案:Node.js 中 XSLT 的最佳选择是 Saxon-JS,它是纯 JavaScript 1 中的 XSLT 3.0 运行时。 请注意,您需要使用商业产品 Saxon-EE 来编译 XSLT,但是一旦完成,您就可以自由地部署结果和运行时。 作为奖励,Saxon-JS 不仅实现了 XSLT 2.0,还实现了 XSLT 3.0。 1警告:一旦 Saxonica 向 JavaScript 运行时添加对解析和序列化的支持,Saxon-JS 显然是您最好的选择。 在此之前,这些限制将严重限制 Saxon-JS 对许多项目的适用性,可能包括您的项目。
  • 带有分组和总和/累加器的 XSLT 3.0 流(XSLT 3.0 Streaming with Grouping and Sum/Accumulator)
    问题 我试图弄清楚如何在需要分组(使用任意数量的组)并对组求和的场景中使用 XSLT Streaming(以减少内存使用量)。 到目前为止,我还没有找到任何例子。 这是一个示例 XML <?xml version='1.0' encoding='UTF-8'?> <Data> <Entry> <Genre>Fantasy</Genre> <Condition>New</Condition> <Format>Hardback</Format> <Title>Birds</Title> <Count>3</Count> </Entry> <Entry> <Genre>Fantasy</Genre> <Condition>New</Condition> <Format>Hardback</Format> <Title>Cats</Title> <Count>2</Count> </Entry> <Entry> <Genre>Non-Fiction</Genre> <Condition>New</Condition> <Format>Paperback</Format> <Title>Dogs</Title> <Count>4</Count> </Entry> </Data> 在 XSLT 2.0 中,我将使用它按流派、条件和格式分组并对计数求和。 <xsl:stylesheet
  • How to use XSLT 3.0 using Saxon-HE 9.8 in .NET
    I'm using Win7 and set my VSC# project to .NETFramework4. Then download SaxonHE9-8-0-7N-setup.exe and install. Then reference saxon9he-api.dll to C# project and using Saxon.Api; And here's my program.cs: static void Main(string[] args) { var xslt = new FileInfo(Path.GetFullPath(Path.Combine(Environment.CurrentDirectory.ToString(), @"..\..\..")) + @"\TEST.xslt"); var input = new FileInfo(Path.GetFullPath(Path.Combine(Environment.CurrentDirectory.ToString(), @"..\..\..")) + @"\TEST.xml"); var output = new FileInfo(Path.GetFullPath(Path.Combine(Environment.CurrentDirectory.ToString(), @"..\..\.."
  • 是否有任何 XSLT 和 XQuery 处理器可用于 .NET Core 3.0 应用程序?(Are there any XSLT and XQuery Processors available for .NET Core 3.0 apps?)
    问题 我一直在使用 Saxon XSLT 和 XQuery 处理器 - 我的一些.NET应用程序的免费家庭版。 我只需要XSLT 2.0 (因为 .NET 不支持 XSLT 3.0)。 现在我已经从.NET Framework转移到.NET Core ,我注意到Saxon尚未支持.NET Core因为在为 Saxon 安装Nuget包时,我收到以下错误。 问题:是否有人知道我可以将其他替代方案用于需要 XSLT 2.0 和 XQuery 处理的.NET Core项目? 由于以下错误,我的代码无法编译,因为它无法识别XdmNode 、 XsltTransformer等。 使用 '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, 恢复了包“Saxon-HE 9.9.1.5”。 NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8' 而不是项目目标框架 '.NETCoreApp,Version=v3.0'。 此包可能与您的项目不完全兼容。 回答1 XmlPrime https://www.xmlprime.com/xmlprime/ 是
  • 如何从 Java 应用程序使用 XSLT 3.0?(How to use XSLT 3.0 from a Java application?)
    问题 我用来处理XSLT和XML文件的通用 Java 代码是: public static final String transformXmlDocument(String inputXmlString, File xsltFile) { TransformerFactory factory = TransformerFactory.newInstance(); StreamSource xslt = new StreamSource(xsltFile); StreamSource text = new StreamSource(new StringReader(inputXmlString)); StringWriter writer = new StringWriter(); StreamResult textOP = new StreamResult(writer); try { Transformer transformer = factory.newTransformer(xslt); transformer.transform(text, textOP); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e2) { e2
  • 如何使用 Saxon-HE 中的 XSLT fn:document 函数读取 XML 字符串?(How to use the XSLT fn:document function in Saxon-HE to read an XML string?)
    问题 我正在使用 Saxon-HE 的 .net 版本。 我已经编写了一些代码来设置 XSLT 转换,其中从外部传入源 XSLT(而不是在运行时从文件中读取)。 这是我的代码片段: Saxon.Api.Processor processor = new Saxon.Api.Processor(); // Feed the XSLT into Saxon XmlDocument document = new XmlDocument(); document.LoadXml(xslt); Saxon.Api.XdmNode input = processor.NewDocumentBuilder().Build(document); Saxon.Api.XsltCompiler xsltCompiler = processor.NewXsltCompiler(); Saxon.Api.XsltExecutable xsltExecutable = xsltCompiler.Compile(input); Saxon.Api.XsltTransformer xsltTransformer = xsltExecutable.Load(); // Create The stream that will contain the transformed XML. MemoryStream
  • 增量/流式 XSLT 转换?(Incremental/streaming XSLT transformations?)
    问题 我通常使用 JDK (JDK 7) 中的 XSLT 支持进行 XSLT 转换。 最近我遇到了一个相当大的 XML 文档,将 XSLT 转换应用于这个(即使是非常基本的)会导致使用大量内存。 我一直很小心地进行所有处理流,但似乎 JDK 中的 XSLT 引擎(似乎是修改后的 Xalan)总是首先在内存中构建 DOM。 显然这不是我想要的。 现在我发现单独提供的 Xalan(2007 年的 2.7.1!)确实有一个用于进行增量转换的 API。 因此,虽然这看起来确实有效,但我实际上希望我的代码在股票 JDK 上运行,而无需告诉用户摆弄任何认可的文件夹。 在 Java 中进行增量 XSLT 转换以便我的代码与未修改/库存 JDK 安装兼容的最佳方法是什么? 更新:这个最近更新的问题密切相关:What is the Most Efficient Java-Based streaming XSLT Processor? 回答1 首先,我强烈建议使用 Xalan 和 Xerces 的 Apache 版本,而不是捆绑在 JDK 中的版本,后者有很多问题。 Xerces 尤其如此。 其次,如果您使用的是 Java,那么您真的应该转向 XSLT 2.0,它极大地提高了开发效率。 实际上,这意味着 Saxon(Saxon 的家庭版是免费的)。 Xalan
  • Are there any XSLT and XQuery Processors available for .NET Core 3.0 apps?
    I've been using Saxon XSLT and XQuery processor - Free home edition for some of my .NET apps. I need only XSLT 2.0 (since .NET does not support XSLT 3.0). Now that I've moved from .NET Framework to .NET Core, I noticed that the Saxon has not yet supported .NET Core since when installing a Nuget package for Saxon, I get the following error. Question: Are there other alternatives that someone knows I can use for my .NET Core projects that need XSLT 2.0 and XQuery processing? Because of the following error my code does not compile since it does not recognize XdmNode, XsltTransformer, etc. Package
  • How to use the XSLT fn:document function in Saxon-HE to read an XML string?
    I'm using the .net version of Saxon-HE. I've written some code to set up an XSLT transformation where the source XSLT is passed in from outside (not read from a file at run-time). Here's a snippet of my code: Saxon.Api.Processor processor = new Saxon.Api.Processor(); // Feed the XSLT into Saxon XmlDocument document = new XmlDocument(); document.LoadXml(xslt); Saxon.Api.XdmNode input = processor.NewDocumentBuilder().Build(document); Saxon.Api.XsltCompiler xsltCompiler = processor.NewXsltCompiler(); Saxon.Api.XsltExecutable xsltExecutable = xsltCompiler.Compile(input); Saxon.Api.XsltTransformer
  • 从Saxon 9.4he中的嵌入式资源加载xml和xslt(Load xml and xslt from embedded resource in Saxon 9.4he)
    问题 我正在使用Saxon 9.4家庭版(Saxon-HE 9.4 .NET)来获得对XSLT 2.0和XPath 2.0以及.NET中XQuery 1.0的支持。 当我加载没有URI的文件时,我的代码崩溃。 是否可以在没有URI的情况下加载xml / xsl文档? 如果不是,是否有任何方法可以为dll文件中嵌入的元素定义URI? 任何其他解决方案也将不胜感激,我唯一的用语是必须从dll文件中加载文件。 只要我从文件加载xml / xsl,我的代码就可以完美地工作: const string sourcePath = @"C:\test\TestInvoiceWithError.xml"; const string xsltpath = @"C:\test\UBL-T10-BiiRules.xsl"; 当我尝试从嵌入式资源加载时,代码引发异常,指出“未提供基本URI” : Stream sourceStream = GetEmbeddedResource("TestProject1.testfiles.TestInvoice.xml"); Stream xsltStream = GetEmbeddedResource("TestProject1.testfiles.UBL-T10-BiiRules.xsl"); 我还为具有相对路径的资源创建了Uri,并抛出异常
  • 将Saxon与python结合使用(Use saxon with python)
    问题 我需要使用python处理XSLT,当前我正在使用仅支持XSLT 1的lxml,现在我需要处理XSLT 2,是否有任何方法可以将saxon XSLT处理器与python一起使用? 回答1 有两种可能的方法: 设置一个接受转换请求的HTTP服务,并通过从Java调用Saxon来实现它们; 然后您可以通过HTTP通过Python发送转换请求使用Saxon / C产品(当前在预发行版中可用) :此处的详细信息:http://www.saxonica.com/saxon-c/index.xml 回答2 用于Saxon / C的Python接口正在开发中,值得一看: https://github.com/ajelenak/pysaxon 回答3 目前还没有,但是您可以使用子流程模块来使用Saxon处理器: import subprocess subprocess.call(["saxon", "-o:output.xml", "-s:file.xml", "file.xslt"]) 回答4 Saxon / C版本1.2.0现已发布,并具有对Python3的XSLT 3.0支持,请参见详细信息: http://www.saxonica.com/saxon-c/index.xml 回答5 如果您使用的是Windows: 从http://saxon.sourceforge.net/#F9
  • XSLT 流式链式转换(XSLT Streaming Chained Transform)
    问题 我正在使用 Saxon EE 使用流式转换来转换一个非常大的文档。 我现在需要链接多个 XSLT。 如何做到这一点? 不流式传输时,我使用 XSLTTransformer 类作为目标,进行链式转换。 如果我没记错的话,我想我不能这样做,因为这会创建一个结果树而不是结果流。 谢谢,阿尼 回答1 将第一个转换的 SAX 输出事件通过管道传输到第二个转换的 SAX 输入事件。 我附上了一些显示这一点的示例 Scala 代码。 基本上,它首先启动第二个 XSLT,它在幕后调用第一个 XSLT,初始输入文档捕获中间输出,然后将其作为输入实时输入到第二个 XSLT。 好的。 它使用 JAXP 接口,因此没有 S9 API。 我已经用一个 1.2GB 的输入 XML 文件成功地测试了它。 希望这可以帮助。 顺便说一句,XSLT 3.0 摇滚! 好的选择。 import javax.xml.transform.sax.{SAXResult, SAXSource} import javax.xml.transform.stream.{StreamResult, StreamSource} import javax.xml.transform.{Source, Transformer} import com.saxonica.config.StreamingTransformerFactory
  • 如何在java中运行撒克逊xslt转换(How to run saxon xslt transformation in java)
    问题 我可以轻松地在命令行中运行以下命令来转换 xml 文件: java -jar saxon9he.jar -o:outputfile.xml data.xml transform.xslt 我想从一个 java 文件中得到完全相同的结果,这样我就可以在我正在制作的程序的一部分中使用它。 我已将 saxon9he.jar 放在构建路径中,但如何在命令行之外调用相同的命令? 回答1 文档在这里:http://www.saxonica.com/documentation/index.html#!using-xsl/embedding Saxon 提供了两种用于从 Java 应用程序运行 XSLT 转换的 API:JAXP API 和 s9api API。 JAXP 是几乎所有 Java XSLT 处理器都提供的标准接口,因此,如果您希望应用程序具有可移植性,就可以使用这个接口; 它的缺点是 (a) 它非常面向 XSLT 1.0,这使得很难利用 XSLT 2.0 和 XSLT 3.0 中的新功能,以及 (b) 它没有与 API 集成得特别好,用于相关任务,例如模式处理和 XPath 评估。 s9api API 与 Saxon 在各种任务(包括 XSLT、XQuery、XPath 和 XSD 验证)中的功能更加匹配,但不可移植。 这是你的选择。 回答2 您最好使用用于 XML 和
  • XSLT - XML 到 CDATA(XSLT - XML into CDATA)
    问题 我有一个转换XML的mule flow : HTTP Listener > Logger > XSLT > Logger 这是原始消息: <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" xmlns:pref="URI_SOAP_WS"> <soap:Body> <entryXML> <note> <to>Totest</to> <from>Fromtest</from> <heading>Query</heading> <body>Update Windows 10</body> </note> </entryXML> </soap:Body> </soap:Envelope> 我想用XSLT转换成这样: <entryXML> <note> <to>Totest</to> <from>Fromtest</from> <heading>Query</heading> <body>Update Windows 10</body> </note> <entryXML> 我试过这个模板: <xsl:stylesheet version="3.0" xmlns:saxon="http://saxon.sf.net/"
  • C# XSLT 快速转换大型 XML 文件(C# XSLT Transforming Large XML Files Quickly)
    问题 我正在使用 XSLT 中的查找模板转换大于 2GB 的文件。 我希望它运行得更快,但找不到任何可以提高性能的低悬果。 任何帮助将不胜感激。 在转换方面,我是新手。 这是 XML 文件的当前格式。 <?xml version="1.0" encoding="utf-8" ?> <contacts> <contact> <attribute> <name>text12</name> <value>B00085590</value> </attribute> <attribute> <name>text34</name> <value>Atomos</value> </attribute> <attribute> <name>date866</name> <value>02/21/1991</value> </attribute> </contact> <contact> <attribute> <name>text12</name> <value>B00058478</value> </attribute> <attribute> <name>text34</name> <value>Balderas</value> </attribute> <attribute> <name>date866</name> <value>11/24/1997</value> <
  • XPTY0004:使用 saxon templatefactory 加载 xslt 时,不允许将空序列作为变量的值(XPTY0004: An empty sequence is not allowed as the value of variable while loading xslt using saxon templatefactory)
    问题 我更新了提供的 xslt 以接受来自我的源的参数“多路复用路径”,并在此处将输入代码分配给 xslt 中的节点变量,如下所示: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all" version="3.0"> <xsl:param name="multiplexpaths" as="xs:string" static="yes" /> <!-- xsl:param name="copy" as="xs:string" static="yes" select="'//other[. = 1345], //more[. = 2]'"/--> <xsl:variable name="nodes" _select="{$multiplexpaths}"/> <xsl:variable name="ancestors" select="$nodes/ancestor::*"/> <xsl:mode on-no-match="shallow-skip"/> <xsl:output
  • 适用于.NET的XPath和XSLT 2.0? [关闭](XPath and XSLT 2.0 for .NET? [closed])
    问题 关闭。 这个问题是题外话。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 8年前关闭。 改善这个问题 .NET 3.5并不完全支持XPATH 2.0或XSLT 2.0,这太糟糕了。 有谁知道在将来的任何.NET版本中是否将包括这两项并提供完全的支持? 回答1 我认为他们不会在短期内增加对XPath 2.0或XSLT 2.0的支持。 但是,只要这些不是BCL的一部分,只要您有可用的第三方实现,您就不会感到难过: 撒克逊人:XPath 3.1,XQuery 3.1,XSLT 3.0 XmlPrime:XPath 3.1,XQuery 3.1,XSLT 2.0 QueryMachine:XPath 2.0,XQuery 1.0 适用于.NET的轻量级XPath2:XPath 2.0 Exselt:XSLT 3.0 Microsoft以客户为导向。 如果客户不想要它,他们将不会成功。 2009-11-18:我在这里与XML团队联系并获得了以下回复: 尽管XML仍然是我们平台未来发展的关键部分,但我们决定目前不采用XSLT 2.0实现。 如果您要完成特定的XSLT任务,并且在使用XSLT 1.0时遇到困难,请告诉我们,我们将尽最大努力为您提供帮助。 该列表现在在github.com/maxtoroq/dotnet-xml中维护 回答2
  • 将 Saxon-PE 与 Apache Camel 一起使用,预加载 Saxon 类时出错(Using Saxon-PE with Apache Camel, Error Pre-Loading Saxon Classes)
    问题 我最近获得了 Saxon-PE 的试用许可证,并希望在 Camel 中使用此版本的 Saxon。 我下载了 Saxon-PE-9.6.0.8 jars 并通过 maven 将它们包含到我的项目中。 我正在使用骆驼 2.16.0。 我为此尝试了很多方法,但我通过使用 Camel 的“?transformerFactory=...”选项并将其传递给 Saxon 的 ProfessionalTransformerFactoryImpl 取得了最大的进展,它在我的 Spring 配置中注册为一个 bean。 启动我的应用程序时,使用 xslt 转换的路由初始化失败并显示以下堆栈跟踪: 引起:java.lang.IllegalStateException:预加载 Saxon 类时出错。 确保类路径上有 saxon,并且类加载器可以加载以下两个类:net.sf.saxon.event.Receiver、net.sf.saxon.serialize.MessageWarner。 在 org.apache.camel.builder.xml.XsltBuilder.doStart(XsltBuilder.java:618) ~[camel-core-2.16.0.jar:2.16.0] 在 org.apache.camel.support.ServiceSupport.start(
  • Saxon 过早地评估 xsl:attribute-set(Saxon Prematurely Evalutes xsl:attribute-set)
    问题 这涉及使用最新的 Saxon EE 9.8 对 XSLT 转换的输入进行模式感知验证。 我的 XSLT 文件包含以下内容。 一个命名空间和相关的架构定义如下: <xsl:import-schema namespace="http://www.fpml.org/2005/FpML-4-2" schema-location="/path/to/some_swbml.xsd"/> 符合上述模式的结果文档: <xsl:result-document method="xml" href="{$file}" format="swbml-format" validation="strict"> <SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" xsl:use-attribute-sets="ir"> GENERATE SOME MORE XML TO BE VALIDATED BY THE XSD </SWBML> </xsl:result-document> 您会注意到结果文档<SWBML>中的父标记xsl:use-attribute-sets="ir"集xsl:use-attribute-sets="ir" 。 属性集定义如下: <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3