0

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

先感谢您!

4

1 回答 1

0

如果您的数据中有一个循环,您的代码将进入无限递归。

我怀疑条件not(inXml)应该是not(inXML='true')防止这种情况发生;但不知道你的数据,我不能确定。

于 2012-09-28T11:53:52.633 回答