这是一个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'节点。
答案 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>