将属性从子节点复制到两个xmls

时间:2016-09-01 07:08:09

标签: xml xslt xslt-1.0

这是一个followup问题。

这次我在xml2中有一个子节点,其中包含我需要复制的属性。

XML1

<?xml version="1.0" encoding="utf-8"?>
<Products>
   <Product prodId="123456" sellId="" colorId="">                
            <Supplier id="" name=""/>
            <Misc lib="" />                    
   </Product>
</Products>

XML2

<?xml version="1.0" encoding="utf-8"?>
<Products>
    <Product>
        <info prodId="123456" sellId="121" colorId="AD3">         
            <qnty lib="34">4</qnty>
        </info>
        <info prodId="23456" sellId="890" colorId="BM7">          
            <qnty lib="2">1</qnty>
        </info>
    </Product>
</Products>

这次,xml2的节点'qnty'的'lib'属性应该转到节点'Misc'的'lib'属性。

现在,我的模板,搜索

<xsl:param name="f1" select="'xml2.xml'"/>
        <xsl:variable name="doc1" select="document($f1)"/>

        <xsl:key name="k1" match="Products/Product/info" use="@prodId"/>

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

        <xsl:template match="Products/Product" >
                <xsl:copy>
                        <xsl:apply-templates select="@*"/>
                        <xsl:variable name="prodId" select="@prodId"/>
                        <xsl:for-each select="$doc1">
                                <xsl:copy-of select="key('k1', $prodId)/@sellId"/>
                                <xsl:copy-of select="key('k1', $prodId)/@colorId"/>                                

                                        <xsl:apply-templates select="Products/Product/Misc"/>
                                        <xsl:copy-of select="key('k1', $prodId)/qnty/@lib"/>        
                        </xsl:for-each>
                        <xsl:apply-templates/>
                </xsl:copy>
        </xsl:template>

'lib'属性被添加到'Product'节点,而不是添加到子'Misc'节点。

1 个答案:

答案 0 :(得分:0)

解决这个问题,不确定它是最好的解决方案:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml" indent="yes"/>

    <xsl:param name="f1" select="'xml2.xml'"/>
    <xsl:variable name="doc1" select="document($f1)"/>

    <xsl:key name="k1" match="Products/Product/info" use="@prodId"/>

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

    <xsl:template match="Products/Product" >
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:variable name="prodId" select="@prodId"/>
            <xsl:for-each select="$doc1">
                <xsl:copy-of select="key('k1', $prodId)/@sellId"/>
                <xsl:copy-of select="key('k1', $prodId)/@colorId"/>                                             
            </xsl:for-each>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>


    <xsl:template match="Products/Product/Misc" >
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:variable name="prodId" select="../@prodId"/>
            <xsl:for-each select="$doc1">                                               
                    <xsl:copy-of select="key('k1', $prodId)/qnty/@lib"/>    
            </xsl:for-each>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>