Я думаю, вы не можете использовать здесь функцию ключа, потому что вам нужно создать набор ключей в $ doc2, а XML Spy не позволяет мне это делать.И ключа в исходном XML не хватит.
Поэтому я написал для вас другое решение, совсем не используя ключ:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"/>
<xsl:param name="doc2"><xsl:copy-of select="document('C:\test\data2.xml')"/></xsl:param>
<xsl:template match="/">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="cell[@colname='2']">
<xsl:variable name="keyValue" select="concat(../cell[@colname='4'], ../cell[@colname='5'])"/>
<xsl:for-each select="$doc2/tables/table/row[concat(cell[@colname='4'], cell[@colname='5']) = $keyValue]">
<xsl:copy-of select="cell[@colname='2']"/>
</xsl:for-each>
</xsl:template>
<!-- Just copy any other elements, attributes, etc. -->
<xsl:template match="@*|node()" >
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
О, и, кстати, у вас есть пара colnane
опечатки в исходных файлах.
EDIT забыли о третьем аргументе в ключевой функции :-(. Поэтому добавив
<xsl:key name="keyx" match="row" use="concat(cell[@colname='4'], cell[@colname='5'])"/>
и изменивкаждый на
<xsl:for-each select="key('keyx', $keyValue, $doc2)">
<xsl:copy-of select="cell[@colname='2']"/>
</xsl:for-each>
достигнет ваших целей.
РЕДАКТИРОВАТЬ 2
ОК, вышеупомянутое заменяет ячейки colname = "2", но неоставьте данные data1, если совпадения data2 не найдены.
Вместо этого используйте следующее:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"/>
<xsl:param name="doc2"/> <!-- supplied in parameter list in specific tool -->
<xsl:key name="keyx" match="row" use="concat(cell[@colname='4'], cell[@colname='5'])"/>
<xsl:template match="/">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="cell[@colname='2']">
<xsl:variable name="keyValue" select="concat(../cell[@colname='4'], ../cell[@colname='5'])"/>
<xsl:variable name="doc2Matches" select="key('keyx', $keyValue, document($doc2))"/>
<xsl:choose>
<xsl:when test="$doc2Matches">
<xsl:copy-of select="$doc2Matches[1]/cell[@colname='2']"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Just copy any other elements, attributes, etc. -->
<xsl:template match="@*|node()" >
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>