В XSLT 2 и 3 вы можете создавать узлы пространства имен, используя xsl:namespace
, поэтому
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:param name="old-ns-year" select="'2018'"/>
<xsl:param name="new-ns-year" select="'2019'"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{replace(namespace-uri(), $old-ns-year, $new-ns-year)}">
<xsl:apply-templates select="namespace::*, @*, node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="namespace::*">
<xsl:namespace name="{name()}" select="replace(., $old-ns-year, $new-ns-year)"/>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}" namespace="{replace(namespace-uri(), $old-ns-year, $new-ns-year)}" select="."/>
</xsl:template>
</xsl:stylesheet>
должно дать вам идею, на https://xsltfiddle.liberty -development.net / pPzifpe itпреобразует
<a:add
xmlns:a="urn:_2018_1.a"
xmlns:b="urn:_2018_1.b"
xmlns:c="urn:_2018_1.c"
>
</a:add>
в
<a:add xmlns:a="urn:_2019_1.a" xmlns:b="urn:_2019_1.b" xmlns:c="urn:_2019_1.c">
</a:add>
с использованием Saxon 9.8.