我有两个大的XML文件,其中第一个文本中的某些文本是错误的,需要用另一个xml文件中的文本替换。
xml 1
<phrase name="1111"><![CDATA[aaaa]]></phrase>
<phrase name="2222"><![CDATA[bbbb]]></phrase>
<phrase name="3333"><![CDATA[cccc]]></phrase>
...
和
xml 2
<phrase name="1111"><![CDATA[dddd]]></phrase>
<phrase name="2222"><![CDATA[eeee]]></phrase>
<phrase name="4444"><![CDATA[ffff]]></phrase>
...
现在,应使用xml 2
中的文本覆盖具有相同名称的元素中的文本output
<phrase name="1111"><![CDATA[dddd]]></phrase>
<phrase name="2222"><![CDATA[eeee]]></phrase>
<phrase name="3333"><![CDATA[cccc]]></phrase>
...
关于如何尽可能简单地做到这一点的任何想法? 我已经尝试过使用XSLT,但我是新手,它没有用,我需要的方式。 如果有任何程序可以处理这个问题,则不需要使用XSLT。
感谢您的帮助
答案 0 :(得分:1)
以下转型
<?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>
以
的形式应用于输入文件first.xml
<doc>
<phrase name="1111"><![CDATA[aaaa]]></phrase>
<phrase name="2222"><![CDATA[bbbb]]></phrase>
<phrase name="3333"><![CDATA[cccc]]></phrase>
</doc>
其中第二个输入文件second.xml
的形式为
<doc>
<phrase name="1111"><![CDATA[dddd]]></phrase>
<phrase name="2222"><![CDATA[eeee]]></phrase>
<phrase name="4444"><![CDATA[ffff]]></phrase>
</doc>
存在产生想要的结果
<doc>
<phrase name="1111"><![CDATA[dddd]]></phrase>
<phrase name="2222"><![CDATA[eeee]]></phrase>
<phrase name="3333"><![CDATA[cccc]]></phrase>
</doc>