Вы можете решить эту проблему только с XSLT-1.0.
Используйте следующую таблицу стилей, которая устанавливает соответствующие пространства имен, а затем удаляет окружающие элементы schema:Body
и schema:MAIN
с помощью шаблона.После этого он также удаляет пространство имен из элемента schema:Message
и воссоздает его с новым целевым пространством имен hhh.kkk.yyy
.Теперь можно легко удалить оставшиеся пространства имен остальных элементов с помощью измененного шаблона идентичности .xsl:strip-space...
просто избавляет от ненужных пробелов в выводе.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:service="xxx.yyy.zzz" xmlns:schema="aaa.bbb.ccc" xmlns:ns0="hhh.kkk.yyy">
<xsl:strip-space elements="schema:MAIN" />
<!-- Modified identity template -->
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
<xsl:template match="service:Body | schema:MAIN">
<xsl:apply-templates select="node()|@*" />
</xsl:template>
<xsl:template match="schema:Message">
<xsl:element name="ns0:Message" namespace="hhh.kkk.yyy">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Его вывод:
<ns0:Message xmlns:ns0="hhh.kkk.yyy">
<XXXXX0>
<XXXXX010>XXXXX0</XXXXX010>
<XXXXX020>I</XXXXX020>
<XXXXX030>8888</XXXXX030>
<XXXXX040>08</XXXXX040>
<XXXXX050>0002</XXXXX050>
<XXXXX060>01</XXXXX060>
<XXXXX090>00</XXXXX090>
<XXXXX100>20190830122000</XXXXX100>
<XXXXX110>1.0</XXXXX110>
<XXXXX120>A</XXXXX120>
<XXXXX130>AAA</XXXXX130>
<XXXXX140>1</XXXXX140>
<XXXXX150>PTT</XXXXX150>
</XXXXX0>
</ns0:Message>