我有两个XML文件(源文件和目标文件),希望使用Java有选择地将源文件的一部分合并到目标文件中。这些文件具有相同的结构,但包含在不同级别具有相同名称的嵌套标记(示例如下)。
源和目标可以有多个/Root/folders/folder,我希望从源中选择(具有指定标题),并将其与目标中的任何内容合并。如果目标已有内容,则不能覆盖;必须添加源内容。在下面的示例中,结果将包含具有多个<folders>的<folder caption="TestBlock" description="desc" moniker="">
我既不精通Java,也不精通XML (但是老板让我这么做,所以……)。
Googling已经展示了许多从文件A到文件B的直接追加的示例,其中没有复杂的嵌套结构,但这些并没有解决我的问题。
源文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Root signature="{9252F941}" version="11.40">
<folders>
<folder caption="TestBlock" description="desc" moniker="">
<folders>
<folder caption="tb_insert" description="desc" moniker="">
<folders>
<folder caption="000_Test" description="desc" moniker="">
<references>
<ref key="{somekey}" />
</references>
</folder>
</folders>
<references>
<ref key="{somekey}" />
</references>
</folder>
</folders>
</folder>
<folder caption="AnotherBlock" description="desc" moniker="">
<folders>
<folder caption="abc" description="desc" moniker="">
<references>
<ref key="{somekey}" />
</references>
</folder>
</folders>
</folder>
</folders>
</Root>目标文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Root signature="{9252F941}" version="11.40">
<folders>
<folder caption="Core" description="desc" moniker="" />
<folder caption="TestBlock" description="desc" moniker="">
<folders>
<folder caption="000_Temp" description="desc" moniker="">
<folders>
<folder caption="000_Temp2" description="desc" moniker="">
<references>
<ref key="{somekey}" />
</references>
</folder>
</folders>
</folder>
</folders>
<references>
<ref key="{somekey}" />
</references>
</folder>
</folders>
</Root>所需输出:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Root signature="{9252F941}" version="11.40">
<folders>
<folder caption="Core" description="desc" moniker="" />
<folder caption="TestBlock" description="desc" moniker="">
<folders>
<folder caption="tb_insert" description="desc" moniker="">
<folders>
<folder caption="000_Test" description="desc" moniker="">
<references>
<ref key="{somekey}" />
</references>
</folder>
</folders>
<references>
<ref key="{somekey}" />
</references>
</folder>
</folders>
<folders>
<folder caption="000_Temp" description="desc" moniker="">
<folders>
<folder caption="000_Temp2" description="desc" moniker="">
<references>
<ref key="{somekey}" />
</references>
</folder>
</folders>
</folder>
</folders>
<references>
<ref key="{somekey}" />
</references>
</folder>
</folders>
</Root>任何帮助(新手级别,请)将不胜感激。
发布于 2019-05-08 22:54:39
我不认为您已经完整地指定了需求(一个示例并没有制定规范),但是如果我们假设第一个源文档恰好包含一个/Root/folders/folder,并且它的内容是替换目标文档中具有匹配标题的唯一//folder,那么逻辑可以在XSLT3.0中编写为
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:variable name="replacement" select="doc('source.xml')/Root/folders/folder"/>
<xsl:template match="folder[@caption = $replacement/$caption]">
<xsl:copy-of select="$replacement"/>
</xsl:template>
</xsl:transform>您可以使用Saxon库通过以下代码从Java运行此代码:
Processor proc = new Processor(false);
XsltCompiler comp = proc.newXsltCompiler();
Xslt30Transformer trans = comp.compile("stylesheet.xsl").load30();
Serailizer out = proc.newSerializer(new File("output.xml"));
trans.applyTemplates(new StreamSource("destination.xml"), out);如果您更喜欢使用JDK附带的XSLT 1.0处理程序,那么这也是可能的,它只需要更多一点的代码。与直接使用低级DOM API相比,它的代码量仍然要少得多。
https://stackoverflow.com/questions/56041094
复制相似问题