Похоже, что вам нужно это простое и короткое преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:inp2="http://HPES.org/"
exclude-result-prefixes="inp2">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="engine">
<inp2:Envelope>
<Body>
<soapP1>
<soapP2>
<engine>
<xsl:copy-of select="@*|node()"/>
</engine>
</soapP2>
</soapP1>
</Body>
</inp2:Envelope>
</xsl:template>
</xsl:stylesheet>
применительно к предоставленному документу XML :
<soap:Envelope
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soapP1>
<soapP2>
<engine value="1" txnElapsedTime="0.05"/>
</soapP2>
</soapP1>
</soap:Body>
</soap:Envelope>
желаемый результат получен :
<inp2:Envelope xmlns:inp2="http://HPES.org/">
<Body>
<soapP1>
<soapP2>
<engine value="1" txnElapsedTime="0.05"/>
</soapP2>
</soapP1>
</Body>
</inp2:Envelope>
Объяснение : только один шаблон, соответствующий engine
- со всеми необходимыми элементами-литерал-результат-элементыкак самый простой способ разместить их в нужных новых пространствах имен и избавиться от других узлов пространства имен, которыми владеют исходные элементы.