You need something along the lines of this.
Use File1.xml as the principal source document.
<xsl:key name="p" match="part" use="partNumber">
<xsl:template match="/">
<parts>
<xsl:for-each select="parts/part">
<part partNumber="{@partNumber}" description="{@description}">
<xsl:copy-of select="key('p', @partNumber, document('File2.xml'))/*"/>
</part>
</xsl:for-each>
</parts>
Thats XSLT 2.0 syntax (key() with 3 arguments). In 1.0 you have to change the xsl:copy-of to
<xsl:variable name="partNr" select="@partNumber"/>
<xsl:for-each select="document('File2.xml')"/>
<xsl:copy-of select="key('p', $partNr)/*"/>
</xsl:for-each>
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference