XSLT转换中的多个文件输入

时间:2010-12-02 10:37:28

标签: xslt

我想用其他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

1 个答案:

答案 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>