相关疑难解决方法(0)

在巨大的目录中转换XML时的java.lang.OutOfMemoryError

我想在一个包含很多级别的庞大目录中使用XSLT2转换XML文件.有超过100万个文件,每个文件是4到10 kB.过了一会儿我总是收到java.lang.OutOfMemoryError:Java堆空间.

我的命令是:java -Xmx3072M -XX:+ UseConcMarkSweepGC -XX:+ CMSClassUnloadingEna bled -XX:MaxPermSize = 512M ...

向-Xmx添加更多内存不是一个好的解决方案.

这是我的代码:

for (File file : dir.listFiles()) {
    if (file.isDirectory()) {
        pushDocuments(file);
    } else {
        indexFiles.index(file);
    }
}

public void index(File file) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

    try {
        xslTransformer.xslTransform(outputStream, file);
        outputStream.flush();
        outputStream.close();
    } catch (IOException e) {
        System.err.println(e.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

由net.sf.saxon.s9api进行的XSLT转换

public void xslTransform(ByteArrayOutputStream outputStream, File xmlFile) {
    try {
        XdmNode source = proc.newDocumentBuilder().build(new StreamSource(xmlFile));
        Serializer out = proc.newSerializer();
        out.setOutputStream(outputStream);
        transformer.setInitialContextNode(source);
        transformer.setDestination(out);
        transformer.transform();

        out.close();
    } …
Run Code Online (Sandbox Code Playgroud)

java xml xslt saxon out-of-memory

5
推荐指数
1
解决办法
3118
查看次数

XSLT:多次添加数字和打印小计

我是XSLT的初学者,并且发现我不能只是将数字加到变量中并以任何方式改变它的值.

我有一个XML文档,其中包含我需要添加的数字列表,直到元素与特定属性值匹配,然后打印该数字将其重置为0并继续累加其余部分,直到我再次看到该特定属性.

例如,我有这个XML:

<list>
 <entry>
  <field type="num" value="189.5" />
 </entry>
 <entry>
  <field type="num" value="1.5" />
 </entry>
 <entry>
  <field type="summary" />
 </entry>
 <entry>
  <field type="num" value="9.5" />
 </entry>
 <entry>
  <field type="num" value="11" />
 </entry>
 <entry>
  <field type="num" value="10" />
 </entry>
 <entry>
  <field type="summary" />
 </entry>
</list>
Run Code Online (Sandbox Code Playgroud)

现在我希望我的XSLT打印出来:

189.5
1.5
#191#
9.5
11
10
#30.5#
Run Code Online (Sandbox Code Playgroud)

我已经读过,我可以通过使用sum()和条件来做到这一点.我知道如何使用for-each并相对指向元素,iam也可以通过简单地总结所有类型= num来使用sum(),但是如何仅将第一个num加起来直到type = summary出现,然后仅下一个sum从最后一个类型=摘要到下一个?

我希望这样的事情:

<xsl:for-each select="list/entry">
 <xsl:if test="field[@type='summary']">
  <!-- we are now at a type=summary element, now sum up -->
  #<xsl:value-of select="sum(WHAT_TO_PUT_HERE?)" />#
 </xsl:if>
 <xsl:if test="field[@type='num']"> …
Run Code Online (Sandbox Code Playgroud)

xml xslt

1
推荐指数
1
解决办法
1137
查看次数

标签 统计

xml ×2

xslt ×2

java ×1

out-of-memory ×1

saxon ×1