我想用其他xml更新一个xml值。
假设我有一个拥有根节点的xml
<Customer>
<Fname>John</Fname>
<Lname>Smith<Lname>
</Customer>
另一个xml正在
<Customer>
<Lname>Smith<Lname>
</Customer>
如果第二个xml中没有该信息,我想将<Fname>John</Fname>
从第一个xml转移到第二个xml。
是否可以在.net?
中使用xslt答案 0 :(得分:3)
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kElementByAncestors" match="*"
use="concat(name(../..),'+',name(..))"/>
<xsl:key name="kAttributeByAncestors" match="@*"
use="concat(name(../..),'+',name(..))"/>
<xsl:param name="pSource2" select="'source2.xml'"/>
<xsl:variable name="vSource2" select="document($pSource2,/)"/>
<xsl:template match="*">
<xsl:variable name="vKey" select="concat(name(..),'+',name())"/>
<xsl:variable name="vCurrent" select="."/>
<xsl:copy>
<xsl:for-each select="$vSource2">
<xsl:variable name="vNames">
<xsl:text>|</xsl:text>
<xsl:for-each select="$vCurrent/*">
<xsl:value-of select="concat(name(),'|')"/>
</xsl:for-each>
</xsl:variable>
<xsl:copy-of select="key('kAttributeByAncestors',$vKey)"/>
<xsl:copy-of select="$vCurrent/@*"/>
<xsl:copy-of
select="key('kElementByAncestors',
$vKey)[not(contains($vNames,
concat('|',
name(),
'|')))]"/>
</xsl:for-each>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
使用此输入:
<Customer>
<Lname>Smith</Lname>
<Data>Data</Data>
</Customer>
和“source2.xml”:
<Customer test="test">
<Fname>John</Fname>
<Lname>Smith</Lname>
</Customer>
输出:
<Customer test="test">
<Fname>John</Fname>
<Lname>Smith</Lname>
<Data>Data</Data>
</Customer>