如何将文本从一个XML文件复制到另一个XML文件

时间:2022-04-17 16:02:19

I have two large XML files, where some text in the first one is wrong and needs to be replaced with text from another xml file.

我有两个大的XML文件,其中第一个文本中的某些文本是错误的,需要用另一个xml文件中的文本替换。

xml 1 

<phrase name="1111"><![CDATA[aaaa]]></phrase>
<phrase name="2222"><![CDATA[bbbb]]></phrase>
<phrase name="3333"><![CDATA[cccc]]></phrase>
...     

and

xml 2

<phrase name="1111"><![CDATA[dddd]]></phrase>
<phrase name="2222"><![CDATA[eeee]]></phrase>
<phrase name="4444"><![CDATA[ffff]]></phrase>
...

Now the text in elements with the same name should be overwriten with the text from xml 2

现在,应使用xml 2中的文本覆盖具有相同名称的元素中的文本

output

<phrase name="1111"><![CDATA[dddd]]></phrase>
<phrase name="2222"><![CDATA[eeee]]></phrase>  
<phrase name="3333"><![CDATA[cccc]]></phrase>
...     

Any ideas on how to do this as easy as possible? I already tried using XSLT, but im new to it and it didnt work, the way i need it. Is doesn't need to be done with XSLT, if there is any programm that can handle this.

关于如何尽可能简单地做到这一点的任何想法?我已经尝试过使用XSLT了,但我是新手,它没有用,我需要的方式。如果有任何可以处理此问题的程序,则不需要使用XSLT。

thanks for your help

谢谢你的帮助

1 个解决方案

#1


0  

The following transformation

以下转型

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output cdata-section-elements="phrase" />

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

    <xsl:template match="//phrase">
        <xsl:variable name="name"><xsl:value-of select="@name" /></xsl:variable>
        <xsl:copy><xsl:choose>
            <xsl:when test="document('second.xml')//phrase[@name=$name]">
               <xsl:apply-templates select="@*" />
               <xsl:value-of select="document('second.xml')//phrase[@name=$name]" />
            </xsl:when>
            <xsl:otherwise><xsl:apply-templates select="@*|node()" /></xsl:otherwise>
        </xsl:choose></xsl:copy>
    </xsl:template>
</xsl:transform>

when applied to an input file first.xml the form of

当应用于输入文件first.xml的形式时

<doc>
<phrase name="1111"><![CDATA[aaaa]]></phrase>
<phrase name="2222"><![CDATA[bbbb]]></phrase>
<phrase name="3333"><![CDATA[cccc]]></phrase>       
</doc>

where a second input file second.xml the form of

其中第二个输入文件是second.xml的形式

<doc>
<phrase name="1111"><![CDATA[dddd]]></phrase>
<phrase name="2222"><![CDATA[eeee]]></phrase>
<phrase name="4444"><![CDATA[ffff]]></phrase>
</doc>

is present produces the wanted result of

存在产生想要的结果

<doc>
<phrase name="1111"><![CDATA[dddd]]></phrase>
<phrase name="2222"><![CDATA[eeee]]></phrase>
<phrase name="3333"><![CDATA[cccc]]></phrase>       
</doc>

#1


0  

The following transformation

以下转型

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output cdata-section-elements="phrase" />

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

    <xsl:template match="//phrase">
        <xsl:variable name="name"><xsl:value-of select="@name" /></xsl:variable>
        <xsl:copy><xsl:choose>
            <xsl:when test="document('second.xml')//phrase[@name=$name]">
               <xsl:apply-templates select="@*" />
               <xsl:value-of select="document('second.xml')//phrase[@name=$name]" />
            </xsl:when>
            <xsl:otherwise><xsl:apply-templates select="@*|node()" /></xsl:otherwise>
        </xsl:choose></xsl:copy>
    </xsl:template>
</xsl:transform>

when applied to an input file first.xml the form of

当应用于输入文件first.xml的形式时

<doc>
<phrase name="1111"><![CDATA[aaaa]]></phrase>
<phrase name="2222"><![CDATA[bbbb]]></phrase>
<phrase name="3333"><![CDATA[cccc]]></phrase>       
</doc>

where a second input file second.xml the form of

其中第二个输入文件是second.xml的形式

<doc>
<phrase name="1111"><![CDATA[dddd]]></phrase>
<phrase name="2222"><![CDATA[eeee]]></phrase>
<phrase name="4444"><![CDATA[ffff]]></phrase>
</doc>

is present produces the wanted result of

存在产生想要的结果

<doc>
<phrase name="1111"><![CDATA[dddd]]></phrase>
<phrase name="2222"><![CDATA[eeee]]></phrase>
<phrase name="3333"><![CDATA[cccc]]></phrase>       
</doc>