【问题标题】:XSLT streaming with xsl:iterate correct way使用 xsl:iterate 正确方式进行 XSLT 流式传输
【发布时间】:2018-01-08 22:45:13
【问题描述】:

我想处理一个 161mo 的数据库,但是 java saxon9he 在 300mb 的 ram 和 .NET 在 1700mb ram 的内存不足,所以我需要使用流媒体,所以我使用 XMLSpy 演示,但我还是不明白xpath 表达式子父逻辑。我在 windows xp sp3 32bit 4gb 内存上。

    <xsl:iterate select="db_entry">
        <xsl:apply-templates select="db_entry"/>
    </xsl:iterate>

使用 xsl:iterate 或 xsl:for-each 进行流式传输的正确方法是什么?该数据库中有近 60000 个条目。 我的意思是如何正确编写这个,因为 db_entry 中的 db_entry 不起作用。

编辑:

<xsl:template match="databank_export">
<xsl:iterate select="db_entry">
    <xsl:apply-templates select="public_data"/>
    <xsl:text> |</xsl:text>
    <xsl:apply-templates select="text_data"/>
    <xsl:text> |</xsl:text>
    <xsl:apply-templates select="research_data"/>
    <xsl:text>&#10;</xsl:text>
</xsl:iterate>
</xsl:template>

我将 db_entry xsl:template 替换为 xsl:iterate 但随后 XMLspy 无法加载大文件,因此流式传输似乎不起作用。 我做得对还是程序限制或演示限制?

第二次编辑:我将把我的整个 xsl 代码放在这里:

<?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" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:array="http://www.w3.org/2005/xpath-functions/array" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:err="http://www.w3.org/2005/xqt-errors" exclude-result-prefixes="array fn map math xhtml xs err" version="3.0">
    <xsl:output method="text" encoding="UTF-8" indent="yes"/>
    <xsl:mode streamable="yes"/>
    <!--
    <xsl:template match="databank_export">
    -->
    <xsl:template match="/">
        <xsl:apply-templates select="databank_export/copy-of(db_entry)" mode="entry"/>
    </xsl:template>
    <xsl:template match="db_entry" mode="entry">
        <xsl:value-of select="public_data, text_data, research_data" separator=" |"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:template>
    <xsl:template match="public_data">
        <xsl:value-of select="sflname"/>
        <xsl:text>; </xsl:text>
        <xsl:apply-templates select="bdata"/>
        <xsl:text>; </xsl:text>
        <xsl:value-of select="gender"/>
        <xsl:text>; PHOTO : |</xsl:text>
        <xsl:value-of select="name, gender, rating, datatype/@sdatatype, datatype/@sdatasource, bdata/sbdate, bdata/sbdate/@ccalendar" separator=" - "/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="bdata/sbtime, bdata/sbtime/@sbtime_ampm, bdata/sbtime/@ctimetype, bdata/sbtime/@stimetype, bdata/sbtime/@stmerid, bdata/sbtime/@ctzauto, bdata/sbtime/@jd_ut, bdata/sbtime/@sznabbr, bdata/sbtime/@time_unknown, bdata/sbtime/@itimeaac, bdata/sbtime/@stimeaac" separator=" "/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="bdata/place, bdata/country, bdata/country/@sctr" separator=", "/>
        <xsl:text>, </xsl:text>
        <xsl:value-of select="bdata/place/@slati, bdata/place/@slong" separator=" "/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="scollector, seditor, biographer" separator=" "/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="screationdate, slasteditdate" separator=" "/>
    </xsl:template>
    <xsl:template match="bdata">
        <xsl:value-of select="sbdate/@iday, sbdate/@imonth, sbdate/@iyear" separator="."/>
        <xsl:text>; </xsl:text>
        <xsl:value-of select="sbtime"/>
        <xsl:text>; </xsl:text>
        <xsl:analyze-string select="sbtime/@stmerid" regex="([hm]{{1}})([0-9]{{1,2}})([ew]{{1}})([0-9]{{0,2}})">
            <xsl:matching-substring>
                <xsl:choose>
                    <xsl:when test="regex-group(3) = 'e'">
                        <xsl:text>+</xsl:text>
                    </xsl:when>
                    <xsl:when test="regex-group(3) = 'w'">
                        <xsl:text>-</xsl:text>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:text>+</xsl:text>
                    </xsl:otherwise>
                </xsl:choose>
                <xsl:choose>
                    <xsl:when test="regex-group(1) = 'h'">
                        <xsl:number value="regex-group(2)" format="01"/>
                    </xsl:when>
                    <xsl:when test="regex-group(1) = 'm'">
                        <xsl:text>00:</xsl:text>
                        <xsl:number value="regex-group(2)" format="01"/>
                        <xsl:text>:</xsl:text>
                        <xsl:number value="regex-group(4)" format="01"/>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:text>+1</xsl:text>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:matching-substring>
        </xsl:analyze-string>
        <xsl:text>; </xsl:text>
        <xsl:value-of select="place, country" separator=","/>
        <xsl:text>; </xsl:text>
        <xsl:value-of select="place/@slati, place/@slong" separator="; "/>
    </xsl:template>
    <xsl:template match="text_data">
        <xsl:value-of select="shortbiography, wikipedia_link, db_link, sourcenotes" separator="|"/>
    </xsl:template>
    <xsl:template match="research_data">
        <xsl:apply-templates select="categories"/>
        <xsl:text>|</xsl:text>
        <xsl:apply-templates select="relationships"/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="events/@count"/>
        <xsl:text>|</xsl:text>
        <xsl:apply-templates select="events"/>
    </xsl:template>
    <xsl:template match="categories">
        <xsl:iterate select="category">
            <xsl:value-of select="@cat_id, @db_id, @catnotes" separator=" "/>
            <xsl:text> - </xsl:text>
            <xsl:value-of select="text()"/>
            <xsl:text> |</xsl:text>
        </xsl:iterate>
    </xsl:template>
    <xsl:template match="relationships">
        <xsl:iterate select="relationship">
            <xsl:value-of select="@rel_id, @rel_db_id, @db_id, @relcat" separator=" "/>
            <xsl:text> - </xsl:text>
            <xsl:value-of select="@relnotes, text()" separator=" - "/>
            <xsl:text> |</xsl:text>
        </xsl:iterate>
    </xsl:template>
    <xsl:template match="events">
        <xsl:iterate select="event">
            <xsl:value-of select="@sevcode, @evn_id, @db_id, @evnotes" separator=" "/>
            <xsl:text> |</xsl:text>
            <xsl:apply-templates select="event_data"/>
            <xsl:text> |</xsl:text>
        </xsl:iterate>
    </xsl:template>
    <xsl:template match="event">
        <xsl:apply-templates select="event_data"/>
    </xsl:template>
    <xsl:template match="event_data">
        <xsl:value-of select="sbdate, sbdate/@ccalendar, sbdate_dmy" separator=" "/>
    </xsl:template>

</xsl:stylesheet>

它适用于一个小示例文件,但不适用于整个 161mb 文件。

最好的问候。

【问题讨论】:

  • 据我所知 XMLSpy 不支持流式传输,他们的文档指出“当前不支持可选的流式传输功能。无论流式属性的值如何,整个文档都将加载到内存中,并且如果有足够的可用内存将被处理。在 64 位应用程序中,这应该不是问题。
  • 至于编写使用流式处理的 XSLT 3.0 样式表或将不使用流式处理就无法工作的样式表转换为使用流式处理的样式表,您确实需要显示输入的结构,以及您一起拥有的相关 XSLT解释你想要什么样的输出。通常将流式处理与正常处理相结合就足够了,例如,如果您有 60000 个条目,那么将一个完整的条目拉入内存可能并不重要,只要它只有一个即可。
  • 还有一个观察:处理 161mo 输入文件可以很容易地完成,无需流式传输。如果你给它 1Gb 的堆内存,它应该可以舒适地运行。
  • 我的系统上有大约 2Gb 的可用内存,transform.exe 在大约 1.8Gb 时崩溃,而 jar 在 300Mb 时崩溃。我将有另一个 8Gb 的 cpu,我会尝试。
  • 请不要在一篇文章中提出多个问题,或者在回答后更改您的问题。您应该只编辑您的问题以消除歧义或添加已请求的信息。

标签: xml xslt xpath saxon xmlspy


【解决方案1】:

马丁已经回答了很多问题,但让我补充几句。

您的示例代码

<xsl:iterate select="db_entry">
    <xsl:apply-templates select="db_entry"/>
</xsl:iterate>

似乎是初学者的错误:除非db_entry 实际上包含另一个db_entry 元素作为孩子,否则应该是

<xsl:iterate select="db_entry">
    <xsl:apply-templates select="."/>
</xsl:iterate>

xsl:iteratexsl:for-each的区别在于xsl:for-each,输入序列中的每一项都是独立处理的:没有定义的处理顺序,也没有办法处理一个项目可能会影响后续项目的处理方式。使用xsl:iterate,可以按顺序处理项目,并且(通过使用xsl:next-iteration)您可以在处理一个项目时设置变量/参数,以便在处理下一个项目时使用。

这种差异与流媒体没有直接关系;然而,xsl:iterate 之所以被引入,是因为有些用例(例如计算银行账户的累计金额)如果没有这样的结构就很难实现流式传输。

您编辑的代码:

<xsl:iterate select="db_entry">
    <xsl:apply-templates select="public_data"/>
    <xsl:text> |</xsl:text>
    <xsl:apply-templates select="text_data"/>
    <xsl:text> |</xsl:text>
    <xsl:apply-templates select="research_data"/>
    <xsl:text>&#10;</xsl:text>
</xsl:iterate>

同样可以使用xsl:for-each 来编写,因为一个项目的处理不依赖于之前项目的处理。然而,无论哪种方式,它都不会满足流式传输规则,因为您在迭代体内进行了三个“向下选择”,并且只允许您选择一个。正如 Martin 所说明的,最简单的解决方法是复制每个 db_entry(作为内存中的树),然后您可以在没有任何流限制的情况下对该副本进行操作。

如果您知道三个子元素按照您处理它们的顺序出现,另一种解决方法是替换:

    <xsl:apply-templates select="public_data"/>
    <xsl:text> |</xsl:text>
    <xsl:apply-templates select="text_data"/>
    <xsl:text> |</xsl:text>
    <xsl:apply-templates select="research_data"/>
    <xsl:text>&#10;</xsl:text>

通过

        <xsl:for-each select="*[
            self::public_data or self::text_data or self::research_data]">
          <xsl:if test="position() ne 1"> |</xsl:if>
          <xsl:apply-templates select="."/>
        </xsl:for-each>
        <xsl:text>&#10;</xsl:text>

(请注意在除第一个之外的每个条目之前放置竖线的小技巧,而不是在除最后一个之外的每个条目之后放置竖线。这是因为当您进行流式传输时,您不知道何时到达终点。当您尝试使代码可流式传输时,这样的小事情变得非常重要。)

正如 Martin 所说,Altova RaptorXML 不支持流式传输:您需要为此使用 Saxon-EE。

【讨论】:

    【解决方案2】:

    举个简单的例子,假设你有很多 db_entry 元素,但我们可以安全地假设拉入内存的单个条目不会导致内存问题,那么你可以在这些元素上使用 copy-of 并使用传统处理在与主模式不同的模式下使用流式传输:

    <?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"
        xmlns:math="http://www.w3.org/2005/xpath-functions/math"
        exclude-result-prefixes="xs math"
        version="3.0">
    
        <xsl:mode streamable="yes"/>
    
        <xsl:output method="text"/>
    
        <xsl:template match="/">
            <xsl:apply-templates select="databank_export/copy-of(db_entry)" mode="entry"/>
        </xsl:template>
    
        <xsl:template match="db_entry" mode="entry">
            <xsl:value-of select="public_data, text_data, research_data" separator=" |"/>
            <xsl:text>&#10;</xsl:text>
        </xsl:template>
    
    </xsl:stylesheet>
    

    这会改变例如

    <?xml version="1.0" encoding="UTF-8"?>
    <databank_export>
       <db_entry>
          <public_data>public data 1</public_data>
          <text_data>text 1</text_data>
          <research_data>research 1</research_data>
       </db_entry>
       <db_entry>
          <public_data>public data 2</public_data>
          <text_data>text 2</text_data>
          <research_data>research 2</research_data>
       </db_entry>
       <db_entry>
          <public_data>public data 3</public_data>
          <text_data>text 3</text_data>
          <research_data>research 3</research_data>
       </db_entry>
       <db_entry>
          <public_data>public data 4</public_data>
          <text_data>text 4</text_data>
          <research_data>research 4</research_data>
       </db_entry>
       <db_entry>
          <public_data>public data 5</public_data>
          <text_data>text 5</text_data>
          <research_data>research 5</research_data>
       </db_entry>
       <db_entry>
          <public_data>public data 6</public_data>
          <text_data>text 6</text_data>
          <research_data>research 6</research_data>
       </db_entry>
       <db_entry>
          <public_data>public data 7</public_data>
          <text_data>text 7</text_data>
          <research_data>research 7</research_data>
       </db_entry>
       <db_entry>
          <public_data>public data 8</public_data>
          <text_data>text 8</text_data>
          <research_data>research 8</research_data>
       </db_entry>
       <db_entry>
          <public_data>public data 9</public_data>
          <text_data>text 9</text_data>
          <research_data>research 9</research_data>
       </db_entry>
       <db_entry>
          <public_data>public data 10</public_data>
          <text_data>text 10</text_data>
          <research_data>research 10</research_data>
       </db_entry>
    </databank_export>
    

    进入

    public data 1 |text 1 |research 1
    public data 2 |text 2 |research 2
    public data 3 |text 3 |research 3
    public data 4 |text 4 |research 4
    public data 5 |text 5 |research 5
    public data 6 |text 6 |research 6
    public data 7 |text 7 |research 7
    public data 8 |text 8 |research 8
    public data 9 |text 9 |research 9
    public data 10 |text 10 |research 10
    

    Saxon 9.8 EE 将使用流媒体。

    xsl:iterate 你可以使用

    <?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"
        xmlns:math="http://www.w3.org/2005/xpath-functions/math"
        exclude-result-prefixes="xs math"
        version="3.0">
    
        <xsl:mode streamable="yes"/>
    
        <xsl:output method="text"/>
    
        <xsl:template match="/">
            <xsl:iterate select="databank_export/db_entry">
                <xsl:apply-templates select="copy-of()" mode="entry"/>
            </xsl:iterate>
        </xsl:template>
    
        <xsl:template match="db_entry" mode="entry">
            <xsl:value-of select="public_data, text_data, research_data" separator=" |"/>
            <xsl:text>&#10;</xsl:text>
        </xsl:template>
    
    </xsl:stylesheet>
    

    至于您的扩展样式表,仍然假设将单个 db_entry 拉入内存以使用不使用流式传输的模式正常处理它,我认为您想要类似的东西

    <?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" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:array="http://www.w3.org/2005/xpath-functions/array" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:err="http://www.w3.org/2005/xqt-errors" exclude-result-prefixes="array fn map math xhtml xs err" version="3.0"
        default-mode="entry">
        <xsl:output method="text" encoding="UTF-8" indent="yes"/>
        <xsl:mode name="start" streamable="yes"/>
        <!--
        <xsl:template match="databank_export">
        -->
        <xsl:template match="/" mode="start">
            <xsl:apply-templates select="databank_export/copy-of(db_entry)" mode="entry"/>
        </xsl:template>
        <xsl:template match="db_entry">
            <xsl:apply-templates select="public_data, text_data, research_data"/>
            <xsl:text>&#10;</xsl:text>
        </xsl:template>
        <xsl:template match="public_data">
            <xsl:value-of select="sflname"/>
            <xsl:text>; </xsl:text>
            <xsl:apply-templates select="bdata"/>
            <xsl:text>; </xsl:text>
            <xsl:value-of select="gender"/>
            <xsl:text>; PHOTO : |</xsl:text>
            <xsl:value-of select="name, gender, rating, datatype/@sdatatype, datatype/@sdatasource, bdata/sbdate, bdata/sbdate/@ccalendar" separator=" - "/>
            <xsl:text>|</xsl:text>
            <xsl:value-of select="bdata/sbtime, bdata/sbtime/@sbtime_ampm, bdata/sbtime/@ctimetype, bdata/sbtime/@stimetype, bdata/sbtime/@stmerid, bdata/sbtime/@ctzauto, bdata/sbtime/@jd_ut, bdata/sbtime/@sznabbr, bdata/sbtime/@time_unknown, bdata/sbtime/@itimeaac, bdata/sbtime/@stimeaac" separator=" "/>
            <xsl:text>|</xsl:text>
            <xsl:value-of select="bdata/place, bdata/country, bdata/country/@sctr" separator=", "/>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="bdata/place/@slati, bdata/place/@slong" separator=" "/>
            <xsl:text>|</xsl:text>
            <xsl:value-of select="scollector, seditor, biographer" separator=" "/>
            <xsl:text>|</xsl:text>
            <xsl:value-of select="screationdate, slasteditdate" separator=" "/>
        </xsl:template>
        <xsl:template match="bdata">
            <xsl:value-of select="sbdate/@iday, sbdate/@imonth, sbdate/@iyear" separator="."/>
            <xsl:text>; </xsl:text>
            <xsl:value-of select="sbtime"/>
            <xsl:text>; </xsl:text>
            <xsl:analyze-string select="sbtime/@stmerid" regex="([hm]{{1}})([0-9]{{1,2}})([ew]{{1}})([0-9]{{0,2}})">
                <xsl:matching-substring>
                    <xsl:choose>
                        <xsl:when test="regex-group(3) = 'e'">
                            <xsl:text>+</xsl:text>
                        </xsl:when>
                        <xsl:when test="regex-group(3) = 'w'">
                            <xsl:text>-</xsl:text>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:text>+</xsl:text>
                        </xsl:otherwise>
                    </xsl:choose>
                    <xsl:choose>
                        <xsl:when test="regex-group(1) = 'h'">
                            <xsl:number value="regex-group(2)" format="01"/>
                        </xsl:when>
                        <xsl:when test="regex-group(1) = 'm'">
                            <xsl:text>00:</xsl:text>
                            <xsl:number value="regex-group(2)" format="01"/>
                            <xsl:text>:</xsl:text>
                            <xsl:number value="regex-group(4)" format="01"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:text>+1</xsl:text>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:matching-substring>
            </xsl:analyze-string>
            <xsl:text>; </xsl:text>
            <xsl:value-of select="place, country" separator=","/>
            <xsl:text>; </xsl:text>
            <xsl:value-of select="place/@slati, place/@slong" separator="; "/>
        </xsl:template>
        <xsl:template match="text_data">
            <xsl:value-of select="shortbiography, wikipedia_link, db_link, sourcenotes" separator="|"/>
        </xsl:template>
        <xsl:template match="research_data">
            <xsl:apply-templates select="categories"/>
            <xsl:text>|</xsl:text>
            <xsl:apply-templates select="relationships"/>
            <xsl:text>|</xsl:text>
            <xsl:value-of select="events/@count"/>
            <xsl:text>|</xsl:text>
            <xsl:apply-templates select="events"/>
        </xsl:template>
        <xsl:template match="categories">
            <xsl:iterate select="category">
                <xsl:value-of select="@cat_id, @db_id, @catnotes" separator=" "/>
                <xsl:text> - </xsl:text>
                <xsl:value-of select="text()"/>
                <xsl:text> |</xsl:text>
            </xsl:iterate>
        </xsl:template>
        <xsl:template match="relationships">
            <xsl:iterate select="relationship">
                <xsl:value-of select="@rel_id, @rel_db_id, @db_id, @relcat" separator=" "/>
                <xsl:text> - </xsl:text>
                <xsl:value-of select="@relnotes, text()" separator=" - "/>
                <xsl:text> |</xsl:text>
            </xsl:iterate>
        </xsl:template>
        <xsl:template match="events">
            <xsl:iterate select="event">
                <xsl:value-of select="@sevcode, @evn_id, @db_id, @evnotes" separator=" "/>
                <xsl:text> |</xsl:text>
                <xsl:apply-templates select="event_data"/>
                <xsl:text> |</xsl:text>
            </xsl:iterate>
        </xsl:template>
        <xsl:template match="event">
            <xsl:apply-templates select="event_data"/>
        </xsl:template>
        <xsl:template match="event_data">
            <xsl:value-of select="sbdate, sbdate/@ccalendar, sbdate_dmy" separator=" "/>
        </xsl:template>
    
    </xsl:stylesheet>
    

    然后需要使用-im:start 运行 Saxon 9.8 EE。以上基本上是您发布的代码,仅使用default-mode="entry" 确保您编写的所有模板及其应用模板属于名为entry 的模式,同时添加了一个可流式start 模式,然后使用我之前的

    的建议
        <xsl:template match="/" mode="start">
            <xsl:apply-templates select="databank_export/copy-of(db_entry)" mode="entry"/>
        </xsl:template>
    

    通过流式传输引入db_entry 元素,但将每个元素的副本推送到非流式传输模式,在该模式下可以使用例如正常处理

        <xsl:template match="db_entry">
            <xsl:apply-templates select="public_data, text_data, research_data"/>
            <xsl:text>&#10;</xsl:text>
        </xsl:template
    

    如果我从头开始编写,我会使用我较短的 sn-p 中的方法将未命名的默认模式设为可流式传输,然后将副本推送到已命名的、不可流式传输的模式,但给出所有代码您已添加更容易设置 default-mode 属性,然后使用命名模式 start 和流作为初始模式。

    如前所述,为了解决内存问题,只有在有数千个 db_entry 元素组成传统处理的输入树大小时,混合流式处理和传统处理的整个方法才有意义。它需要 Saxon 9.8 EE(或者可能是 9.7 EE)作为当前唯一的流实现。

    请注意,我没有努力检查或更正您发布的所有模板,一般来说,您可以在您尝试过xsl:iterate 的许多地方使用xsl:for-each,或者我更喜欢在那里使用例如&lt;xsl:apply-templates select="event"/&gt;并设置&lt;xsl:template match="event"&gt;...&lt;/xsl:template&gt;,保持代码模块化和处理方式一致。

    【讨论】:

    • 我想输出为类似 csv 的文件,每行 1 个条目,几乎就像您在示例中所做的那样。我会将我的整个代码与 copy-of() 更正和更清晰的代码一起放置,但我拥有 Java & NET Saxon9he 和 XMLspy 的所有 3 个程序仍然崩溃。
    • 我展示的 XSLT 代码使用流式传输,到目前为止只有 Saxon EE 支持,所以告诉我你不能让它与 Saxon HE 一起工作我无能为力。如果您想测试这些建议,请获取 Saxon 9.8 EE 的试用许可证。或者,如果您想使用 Saxon 9.8 HE,则测试您的原始代码是否有效,如果您使用适当的设置增加 Java VM 内存,如注释中所示。
    • 此外,您添加的 XSLT 表明 db_entry 内有几个嵌套元素您还想以各种方式处理,所以我目前不确定 db_entry 上是否有 copy-of()树中如此高的元素是确保内存消耗保持不变的正确方法,这实际上取决于这些元素中有多少数据以及有多少子元素甚至后代。
    • @RyosanCiffer,我尝试使用我的第一个答案中概述的方法将您的大型代码示例变形为某种东西。您将不得不测试自己是否有意义,因为没有示例数据并且那里的代码太多,无法通过阅读和编辑来检查它。
    • 我会在获得 Saxon9ee 的试用密钥时尝试这个。我编辑了我的第一篇文章以提出 2 个相关问题,以免再次解释整个问题。
    猜你喜欢
    • 2018-11-02
    • 2014-05-09
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多