У меня есть входное мыльное сообщение, пытающееся заменить часть пространства имен uri другой строкой. Я могу заменить весь URI другим URI, но не могу изменить существующий URI. Мне нужно найти «OLDSTRING» и заменить на «NEWSTRING». Строка VARIABLESTRING варьируется в каждом входном xml, поэтому я должен оставить ее в выходном xml.
Входной XML:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:schemas-OLDSTRING-com:VARIABLESTRING">
<soapenv:Header/>
<soapenv:Body>
<requestMessage xmlns="urn:schemas-OLDSTRING-com:VARIABLESTRING">
<merchantID>TESTID</merchantID>
</requestMessage>
</soapenv:Body>
</soapenv:Envelope>
ВЫВОД XML:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:schemas-NEWSTRING-com:transaction-data-1.69">
<soapenv:Header/>
<soapenv:Body>
<requestMessage xmlns="urn:schemas-NEWSTRING-com:VARIABLESTRING">
<merchantID>TESTID</merchantID>
</requestMessage>
</soapenv:Body>
</soapenv:Envelope>
Я попробовал следующий XSL и смог изменить URI пространства имен, но я хочу заменить только «OLDSTRING» на «NEWSTRING» и оставить оставшуюся строку как есть.
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*|*|text()" />
</xsl:copy>
</xsl:template>
<xsl:template match="//*[namespace-uri()='urn:schemas-OLDSTRING-com:VARIABLESTRING']">
<xsl:element name="{local-name()}" namespace="urn:schemas-NEWSTRING-com:VARIABLESTRING" >
<xsl:apply-templates select="@*|*|text()" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>