XSLT:复制元素文本,它本身就是一个 xml 文档,而不使用 value-of

问题描述

我正在复制我需要的元素的文本内容(这是一个嵌入的 xml 文档)并从文本创建新文档,如下所示,我无法控制交付给我的文件格式。问题是,有时我会在这个元素中传递大 (3MB+) 文本值(xml 文件)并且解析器崩溃(java 堆空间) - 我认为这是因为 value-of 无法处理文本作为一个字符串。理想情况下,我只想做一个副本或某种身份转换来剥离其他元素,或者复制而不将其缓冲到字符串中。我认为这是问题是否正确,有没有办法? (不增加更多内存)。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" omit-xml-declaration="yes" />
      
  <xsl:template match="/">
    <xsl:value-of select="root/toplevel/row/payload" />
  </xsl:template>
</xsl:stylesheet>
<?xml version='1.0' ?>
<root>
    <toplevel>
        <row>
            <payload> 
                    &lt;?xml version="1.0" encoding="UTF-8"?>
                            &lt;documentProperties type="documentProperties">
                                &lt;producedBy>
                                    &lt;ourName type="string">NAMEHERE&lt;/ourName>
                                    &lt;user>Someone&lt;/user>
                                &lt;/producedBy>
                            &lt;/documentProperties>
            </payload>
            <System>NotWanted</System>
        </row>
    </toplevel>NotWantedEither
</root>

注意末尾的兄弟元素和父元素中的文本是不需要的,并且有时会包含在我尝试过的多次复制中。我只想要有效载荷中的内容。此代码适用于此示例,但不适用于文本超出某些大小限制的情况。

输出

                    <?xml version="1.0" encoding="UTF-8"?>
                            <documentProperties type="documentProperties">
                                <producedBy>
                                    <ourName type="string">NAMEHERE</ourName>
       ......
 <.... in practice +3 MB more content in output and source element text here...>
.......
                                    <user>Someone</user>
                                </producedBy>
                            </documentProperties>

解决方法

没有找到所需的 XSLT 解决方案,需要相当快的工作流程。添加更多内存为我解决了这个问题。将堆空间 Xmx 增加到 10G 作为解决这种情况的奇数时间。