我将从代码开始 - 我们都喜欢代码: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 节点。我怎样才能做到这一点?
先感谢您!