在合并使用Python XSLT多个XML(Merging multiple xml using x

2019-10-29 07:42发布

我有一个XML文件100的目录中。 该XML的结构是完全一样的。 不过,我想添加一些XML的节点一起并保留其余的,因为它是。

实施例1的xml

<?xml-stylesheet type='text/xsl' href='image_metadata_stylesheet.xsl'?>
<dataset>
<name>imglab dataset</name>
<comment>Created by imglab tool.</comment>
<images>
<image file='/home/orcl/user102339/Area123/Geo_Tag_0812-0420.jpg'></image>
<image file='/home/orcl/user102339/Area123/Geo_Tag_0812-0544.jpg'>
<box top='343' left='72' width='92' height='29'>
<label>LBS_Marks
</label></box></image>
<image file='/home/orcl/user102339/Area123/Geo_Tag_0812-0489.jpg'></image>
</images>
</dataset>

实施例2的xml

<?xml-stylesheet type='text/xsl' href='image_metadata_stylesheet.xsl'?>
<dataset>
<name>imglab dataset</name>
<comment>Created by imglab tool.</comment>
<images>
<image file="/home/orcl/user102339/Area123/Geo_Tag_0812-0420.jpg">
    <box top="505" left="326" width="59" height="32">
                <label>SBS_Marks</label>
            </box>
    </image>
<image file="/home/orcl/user102339/Area123/Geo_Tag_0812-0544.jpg">
    <box top="507" left="331" width="50" height="27">
                <label>SBS_Marks</label>
            </box>
    </image>
<image file="/home/orcl/user102339/Area123/Geo_Tag_0812-0489.jpg">
    <box top="509" left="330" width="51" height="25">
                <label>SBS_Marks</label>
            </box>
    </image>
</images>
</dataset>

在这两个数据集,所述图像是相同的,不过的标记是不同的。 例如,在第一个例子中,第一个图像0420.jpg没有任何与之相关的框的标签,而在第二个文件相同的图像具有与相关联的标签SBS_Marks箱标签。 我想这些文件合并在一起,因此,对于每个图像,我只得到了箱子坐标和标签。 例如所需的输出将是如下:

<?xml-stylesheet type='text/xsl' href='image_metadata_stylesheet.xsl'?>
<dataset>
<name>imglab dataset</name>
<comment>Created by imglab tool.</comment>
<images>
<image file='/home/orcl/user102339/Area123/Geo_Tag_0812-0420.jpg'>
<box top="505" left="326" width="59" height="32">
                <label>SBS_Marks</label>
            </box>
</image>
<image file='/home/orcl/user102339/Area123/Geo_Tag_0812-0544.jpg'>
<box top='343' left='72' width='92' height='29'>
<label>LBS_Marks
</label></box>
<box top="507" left="331" width="50" height="27">
                <label>SBS_Marks</label>
            </box>
</image>
<image file='/home/orcl/user102339/Area123/Geo_Tag_0812-0489.jpg'>
<box top="509" left="330" width="51" height="25">
                <label>SBS_Marks</label>
            </box>

</image>
</images>
</dataset>

在所期望的输出示例中,第一图像0420.jpg具有从第二文件中的框和标签元件,第二图像0544.jpg具有两个框和标签每一个从文件1和文件2和第三图像具有从所述框和标签第二个文件。

我尝试使用此代码:

#!/usr/bin/env python
import sys
from xml.etree import ElementTree

def run(files):
    first = None
    for filename in files:
        data = ElementTree.parse(filename).getroot()
        if first is None:
            first = data
        else:
            first.extend(data)
    if first is not None:
        print ElementTree.tostring(first)

if __name__ == "__main__":
    run(sys.argv[1:])

但是,这只是打印文件的内容之一后,其他,但不会合并。 我不知道如何创建一个XSL模板,因此不能用它试试。 有人可以与上述一个更好的代码帮助或提供一个XSL模板,可以帮助我在合并所有这些文件的文件夹中,请。

Answer 1:

如果你只限于然后XSLT 1我想一种方法是使用Python来构建一个XML文件,列出你想要的格式合并例如,您的目录下的所有XML文件

<files>
  <file name="doc1.xml"/>
  <file name="doc2.xml"/>
  ...
</files>

然后使用该文件作为输入文件到您的XSLT和编写代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:variable name="files" select="document(files/file/@name)"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/">
        <xsl:apply-templates select="$files[1]/node()"/>
    </xsl:template>

    <xsl:template match="image[@file]">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            <xsl:apply-templates select="$files[position() > 1]//image[@file = current()/@file]/node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

当然,如果你必须要然后合并几百个文件的document(files/file/@name)将他们拉入所有记忆,但我没有看到周围的任何方式,如果你想用一个单一的转换合并他们。



文章来源: Merging multiple xml using xslt in Python
标签: python xml xslt