XML 是这样的:
<dict>
<key>2</key>
<array>
<string>A</string>
<string>B</string>
</array>
<key>3</key>
<array>
<string>C</string>
<string>D</string>
<string>E</string>
</array>
</dict>
XML Two 是这样的:
<dict>
<key>A</key>
<array>
<string>A1</string>
<false/>
<false/>
<array>
<string>Apple</string>
<string>This is an apple</string>
</array>
<array>
<string>Apple Pie</string>
<string>I love Apple Pie.</string>
</array>
</array>
<key>B</key>
<array>
<string>B7</string>
<false/>
<false/>
<array>
<string>Boy</string>
<string>I am a boy.</string>
</array>
</array>
</dict>
我想转换成这样:
<dict>
<key>2</key>
<array>
<string>A, Apple, Apple Pie</string>
<string>B, Boy</string>
</array>
...
</dict>
最佳答案
假设第二个 XML 文件名为 two.xml
,您可以使用 XSLT 通过在第一个 XML 文件上应用以下样式表来实现:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="string-by-key"
match="/dict/array/array/string[1]"
use="preceding::key[1]"/>
<xsl:template match="dict">
<dict>
<xsl:apply-templates select="key"/>
</dict>
</xsl:template>
<xsl:template match="key">
<key>
<xsl:value-of select="."/>
</key>
<array>
<xsl:apply-templates select="following-sibling::array[1]/string"/>
</array>
</xsl:template>
<xsl:template match="string">
<string>
<xsl:variable name="key" select="."/>
<xsl:value-of select="$key"/>
<xsl:for-each select="document('two.xml')">
<xsl:for-each select="key('string-by-key', $key)">
<xsl:text>, </xsl:text>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:for-each>
</string>
</xsl:template>
</xsl:stylesheet>
这里的关键技巧(没有双关语意)是
- 使用
xsl:key
索引 通过他们的关键字符串,让容易 和快速查找,以及 - 改变
第二个 XML 文件的上下文节点
在调用之前使用
xsl:for-each
键
函数。
编辑。由于您专门询问了 Linux,您可以使用 xsltproc
程序将 XSLT 样式表应用到您的输入文件,如下所示:
xsltproc stylesheet.xsl one.xml
关于xml - 有什么办法可以在 Linux 中将两个 xml 合并为一个 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2815494/