这是我的问题。我有2个xmlfiles,结构相同,第二个xml只包含少量节点。
File1中
<root>
<alpha>111</alpha>
<beta>22</beta>
<gamma></gamma>
<delta></delta>
</root>
文件2
<root>
<beta>XX</beta>
<delta>XX</delta>
</root>
这就是结果应该是什么样的
<root>
<alpha>111</alpha>
<beta>22</beta>
<gamma></gamma>
<delta>XX</delta>
</root>
基本上,如果File1中任何节点的节点内容为空,那么它应该从File2读取值(如果存在,那就是)。
我确实试过了我的运气与Microsoft XmlDiff API,但它对我来说没有用(补丁程序没有对源文档应用更改)。我也有点担心它使用的DOM方法,因为我将要处理的xml的大小。 能否请你提出一个很好的方法。 我正在使用C#2
答案 0 :(得分:2)
在XSLT中,如果在File1中遇到空节点,则可以使用document()
函数从File2检索节点。类似的东西:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="root/*[.='']">
<xsl:variable name="file2node">
<xsl:copy-of select="document('File2.xml')/root/*[name()=name(current())]"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$file2node != ''">
<xsl:copy-of select="$file2node"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:2)
这是Alastair提出的一个更简单,更有效的解决方案(参见我对他的解决方案的评论)。
这种转变:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:variable name="vFile2" select="document('File2.xml')"/> <xsl:template match="*"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="*[not(text())]"> <xsl:copy> <xsl:copy-of select="$vFile2/*/*[name() = name(current())]/text()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
应用于此XML文档时:
<root> <alpha>111</alpha> <beta>22</beta> <gamma></gamma> <delta></delta> </root>
产生想要的结果:
<root> <alpha>111</alpha> <beta>22</beta> <gamma></gamma> <delta>XX</delta> </root>
答案 2 :(得分:1)
此合并似乎非常具体。
如果是这种情况,只需编写一些代码来加载两个xml文件并按照您的描述应用更改。