我有两个大的XML文件,其结构大致类似于此:
文件1
<thing id="1">
<group id="1.1">
<line id="1.1.1">First</line>
<line id="1.1.2">Third</line>
</group>
<group id="1.2">
<line id="1.2.1">Fifth</line>
</group>
</thing>
文件2
<thing id="1">
<group id="1.1">
<line id="1.1.1">Second</line>
<line id="1.1.2">Fourth</line>
</group>
<group id="1.2">
<line id="1.2.1">Sixth</line>
</group>
</thing>
预期输出
我需要实现的是这个
<thing id="1">
<group id="1.1">
<line id="1.1.1">FirstSecond</line>
<line id="1.1.2">ThirdFourth</line>
</group>
<group id="1.2">
<line id="1.2.1">FifthSixth</line>
</group>
</thing>
[基本上,我希望将第二个文件中的行元素的内容追加到第一个文件中的行元素的内容之后。这些ID是唯一的。该行元素的内容除了文本之外,还可以包含其他XML节点。
文件很大且很笨拙,因此不幸的是,手动选择不是一种选择。
我一直在摆弄Java的XML库,但进展不大。
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="doc2" select="doc('file2.xml')"/>
<xsl:key name="lineId" match="line" use="@id"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="line">
<line id="{@id}">{.}{key('lineId',@id,@doc2)}</line>
</xsl:template>
</xsl:transform>
例如,通过下载Saxon并使用命令,将此样式表应用于file1.xml。>
java net.sf.saxon.Transform -s:file1.xml -xsl:stylesheet.xsl
这是XSLT 3.0; XSLT 1.0中的解决方案会有点冗长,但难度不大。