我想在一个包含很多级别的庞大目录中使用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) 我是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)