【发布时间】:2012-09-20 06:20:58
【问题描述】:
我将从代码开始 - 我们都喜欢代码:D
XML:
<report>
<subject>
<subjectId>1</subjectId>
<name>John</name>
<surname>Doe</surname>
</subject>
<subject>
<subjectId>2</subjectId>
<name>Frank</name>
<surname>Timothy</surname>
</subject>
<individual>
<individualId>10</individualId>
<name>Isaac</name>
<surname>Newton</surname>
<co-worker>
<subject>
<subjectId>1</subjectId>
<inXml>true</inXml>
</subject>
<subject>
<subjectId>2</subjectId>
<inXml>true</inXml>
</subject>
</co-worker>
</individual>
<owner>
<subject>
<subjectId>2</subjectId>
<inXml>true</inXml>
</subject>
<share>100</share>
</owner>
<individual>
<individualId>10</individualId>
<inXml>true</inXml>
</individual>
</report>
XML 2:
<report>
<owner>
<individual>
<individualId>10</individualId>
<inXml>true</inXml>
</individual>
</owner>
<individual>
<individualId>2</individualId>
<name>John</name>
<surname>Doe</surname>
<co-worker>
<individual>
<individualId>10</individualId>
<inXml>true</inXml>
</individual>
</co-worker>
</individual>
<individual>
<individualId>10</individualId>
<name>Isaac</name>
<surname>Newton</surname>
<co-worker>
<individual>
<individualId>2</individualId>
<inXml>true</inXml>
</individual>
</co-worker>
</individual>
</report>
XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes" />
<xsl:template match="individual[inXml='true']">
<xsl:variable name="indId" select="./individualId/text()" />
<xsl:variable name="result" select="//individual[not(inXml) and individualId=$indId]/*" />
<xsl:choose>
<xsl:when test="$result != ''">
<xsl:copy>
<xsl:apply-templates select="$result" />
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="subject[inXml='true']">
<xsl:variable name="subId" select="./subjectId/text()" />
<xsl:variable name="result" select="//subject[not(inXml) and subjectId=$subId]/*" />
<xsl:choose>
<xsl:when test="$result != ''">
<xsl:copy>
<xsl:apply-templates select="$result" />
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我想达到什么目的? - 我想在出现“inXml”标签的地方复制主题/个人。 XSLT 似乎可以工作..但是对于稍大的 xmls.. 大约 1MB(它并不大..) 我的 java 应用程序因 java.lang.OutOfMemoryError: Java heap space 而失败。 我将流重定向到文件......令人惊讶的是 - 转换结果的文件以光速增长 - 15秒后大约300mb! :D hehehe - 这证明我的 xlst 中一定有一些错误导致无限循环。
重要的是——在复制节点时,可能会发生内部已经存在“inXml”的情况——这就是我应用模板或结果的原因。我准备的 XML 描述了这个问题。
编辑: XML2 很可能完全搞砸我的应用程序。我该如何解决?我希望通过 XSLT 解决我的 jaxb 解组问题——这不是我知道的解决方案——我需要在解组过程中插入对象的引用,而不是尝试在那里插入更多的 XML 节点。我怎样才能做到这一点?
提前谢谢你!
【问题讨论】:
-
您帖子中的 xml 和 xsl 适用于我使用 xsltproc 运行。
-
就像我说的......它在小文件中工作。在大的时候它会崩溃;-/
-
考虑在转换失败的地方发布一个最小但完整的文件。您是否尝试过增加 Java JRE 允许分配的内存?您使用哪种 Java XSLT 处理器?如果数据结构是递归的并且一次又一次地调用应用模板,那么我也预计会出现堆栈溢出,不一定是内存不足错误。当您转换到一个文件时,您看到结果在增长,您是中止了转换还是在一段时间后完成了?
-
它没有完成。在“几秒钟”之后,我立即停止了应用程序,文件超过 2gb :D 我为自己感到骄傲.. ]:>
标签: java xml xslt xml-parsing stax