Это короткое и простое полное преобразование (переопределение правила идентификации):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns="http://xyz.com/xsd">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tns:SPR">
<tns:ONE>
<xsl:apply-templates/>
</tns:ONE>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://xyz.com/xsd">
<soapenv:Header>
<xsd:myHeader>
<!--Optional:-->
<APP_ID>APP_ID</APP_ID>
</xsd:myHeader>
</soapenv:Header>
<soapenv:Body>
<tns:SPR xmlns:tns="http://xyz.com/xsd">
<Info>
<System>
<id>id</id>
<sourceSystemName>sourceSystemName</sourceSystemName>
</System>
<Type>transmissionType</Type>
<Id>encounterId</Id>
</Info>
</tns:SPR>
</soapenv:Body>
</soapenv:Envelope>
дает желаемый, правильный результат :
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://xyz.com/xsd">
<soapenv:Header>
<xsd:myHeader><!--Optional:-->
<APP_ID>APP_ID</APP_ID>
</xsd:myHeader>
</soapenv:Header>
<soapenv:Body>
<tns:ONE xmlns:tns="http://xyz.com/xsd">
<Info>
<System>
<id>id</id>
<sourceSystemName>sourceSystemName</sourceSystemName>
</System>
<Type>transmissionType</Type>
<Id>encounterId</Id>
</Info>
</tns:ONE>
</soapenv:Body>
</soapenv:Envelope>
Объяснение
Правило идентификации / template копирует каждый узел "как есть" .
Существует только один шаблон, который переопределяет правило идентификации - соответствует любому элементу tns:SPR
.
В этом переопределяющем шаблоне выводится новый элемент-литерал с именем tns:ONE
- внутри его тела обрабатываются все его дочерние узлы (по шаблону идентификации, что приводит к копированию их "как есть").
Помните : Использование и переопределение правила идентификации является наиболее фундаментальным и мощным шаблоном проектирования XSLT - лучше всего подходит для любой задачи, требующей копирования большинства узлов «как есть» и только для другой обработки некоторые конкретные узлы - переименовать / удалить / вставить, ... и т. д.