名前空間URIの一部を別の文字列に置き換えようとしている入力SOAPメッセージがあります。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>