【问题标题】:Merge two xml files (add to first file unique element found in second)合并两个 xml 文件(添加到第二个找到的第一个文件唯一元素)
【发布时间】:2015-01-08 16:31:01
【问题描述】:

我有一个包含元素列表的 xml 文件,每个元素都包含许多子元素,其中一个 SHA1 包含唯一的内容。

<?xml version="1.0" encoding="UTF-8"?>
<container>
    <sharedLibrary>
        <SF>
            <FID>One</FID>
            <SHA1>X6PZOW4DLFDUEQU3SW5VPK7MTIF62T2A</SHA1>
        </SF>
        <SF>
            <FID>Two</FID>
            <SHA1>RNKTROE47ZOGJ52Y6QMXPZJPZ56HSXCM</SHA1>
        </SF>
        <SF>
            <FID>And so on</FID>
            <SHA1>4MA633OCAHQC752T5D35LP5TUHQQR3WP</SHA1>
        </SF>
    </sharedLibrary>
</container>

第二个xml文件类似,但结构不同(唯一元素sha1)。

<?xml version="1.0" encoding="UTF-8"?>
<containerone>
    <containertwo>
        <shared-file>
            <sha1>X6PZOW4DLFDUEQU3SW5VPK7MTIF62T2A</sha1>
            <file-size>4563154</file-size>
        </shared-file>
        <shared-file>
            <sha1>4MA633OCAHQC752T5D35LP5TUHQQR3WP</sha1>
            <file-size>5267456</file-size>
        </shared-file>
    </containertwo>
</containerone>

结果文件更新第一个 xml 文件,其中包含新的 SIZE 元素。如果唯一元素内容相等,它应该包含来自file-size 元素的内容。如果不是,它必须包含文本not known。查看预期结果:

<?xml version="1.0" encoding="UTF-8"?>
<container>
    <sharedLibrary>
        <SF>
            <FID>One</FID>
            <SHA1>X6PZOW4DLFDUEQU3SW5VPK7MTIF62T2A</SHA1>
            <SIZE>4563154</SIZE>
        </SF>
        <SF>
            <FID>Two</FID>
            <SHA1>RNKTROE47ZOGJ52Y6QMXPZJPZ56HSXCM</SHA1>
            <SIZE>not known</SIZE>
        </SF>
        <SF>
            <FID>And so on</FID>
            <SHA1>4MA633OCAHQC752T5D35LP5TUHQQR3WP</SHA1>
            <SIZE>5267456</SIZE>
        </SF>
    </sharedLibrary>
</container>

首选 XSL 样式表或其他可以做到这一点的工具。

【问题讨论】:

    标签: xml xslt merge


    【解决方案1】:

    假设 XSLT 2.0

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="doc2-url" select="'second-file.xml'"/>
    <xsl:variable name="doc2" select="document($doc2-url)"/>
    
    <xsl:key name="by-sha1" match="containertwo/shared-file" use="sha1"/>
    
    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="SF">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
        <SIZE><xsl:value-of select="(key('by-sha1', SHA1, $doc2)/file-size, 'not known')[1]"/></SIZE>
      </xsl:copy>
    </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 第一个xml文件应该放在哪里?编辑:将此作为样式表添加到第一个文件。
    • 第一个 XML 文件应该作为样式表的主要输入源提供给 XSLT 2.0 处理器。因此,对于 Saxon 9,例如在命令行上使用 -s:file1.xml
    • 撒克逊人抛出错误。 SXXP0003:XML 解析器报告的错误:元素“xsl:param”的前缀“xsl”未绑定。
    • 是的,抱歉,我没有发布完整的样式表,我只展示了模板。我将编辑以将模板包装在适当的根元素中。
    • 元素类型“xsl:copy”必须以匹配的结束标签“”结束。
    猜你喜欢
    • 2013-09-25
    • 2020-06-13
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多