सोप संदेश में XSLT का उपयोग कर नामस्थान यूरी की जगह




xslt-1.0 exslt (2)

क्या यह आपके लिए क्या करना है?

<?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="{replace(namespace-uri(), 'OLDSTRING', 'NEWSTRING')}" >
            <xsl:apply-templates select="@*|*|text()" />
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

मेरे पास एक इनपुट साबुन संदेश है, जो एक भिन्न स्ट्रिंग के साथ नामस्थान यूरी के हिस्से को बदलने की कोशिश कर रहा है। मैं एक अलग यूआरआई के साथ पूरे यूआरआई को बदलने में सक्षम हूं, लेकिन मौजूदा यूआरआई को संशोधित करने में सक्षम नहीं है। मुझे 'OLDSTRING' की तलाश करने और 'NEWSTRING' से बदलने की ज़रूरत है स्ट्रिंग वर्जन प्रत्येक इनपुट एक्सएमएल में बदलता रहता है, इसलिए मुझे इसे रखना चाहिए क्योंकि यह आउटपुट एक्सएमएल में है

इनपुट 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>

आउटपुट एक्सएमएल:

<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 की कोशिश की है, और नामस्थान यूआरआई बदलने में सक्षम है, लेकिन मैं 'केवल' पुराना 'के साथ' OLDSTRING 'को बदलना चाहता हूं और शेष स्ट्रिंग जैसे ही रहता हूं।

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>

इस तरह की प्रसंस्करण XSLT 2.0 में आसान है, लेकिन XSLT 1.0 में बहुत मुश्किल है :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pTarget" select="'OLDSTRING'"/>
 <xsl:param name="pRepl" select="'NEWSTRING'"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
  "*[starts-with(namespace-uri(), 'urn:schemas')
   or
     namespace::*[starts-with(., 'urn:schemas')]
    ]">

  <xsl:variable name="vNS" select="namespace-uri()"/>

  <xsl:variable name="vNewNS">
    <xsl:choose>
      <xsl:when test="not(contains($vNS, $pTarget))">
        <xsl:value-of select="$vNS"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="substring-before($vNS, $pTarget)"/>
        <xsl:value-of select="$pRepl"/>
        <xsl:value-of select="substring-after($vNS, $pTarget)"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <xsl:element name="{name()}" namespace="{$vNewNS}">
   <xsl:copy-of select=
     "namespace::*
        [not(. = $vNS
            or
             starts-with(., 'urn:schemas')
           and
             contains(., $pTarget)
             )
        ]"/>

   <xsl:for-each select=
     "namespace::*
        [starts-with(., 'urn:schemas')
       and
         contains(., $pTarget)
        ]">
     <xsl:variable name="vNewNSUri" select=
     "concat(substring-before(., $pTarget),
             $pRepl,
             substring-after(., $pTarget)
             )
     "/>

     <xsl:variable name="vPrefix" select="name()"/>

     <xsl:variable name="vPref">
       <xsl:if test="$vPrefix">
         <xsl:value-of select="concat($vPrefix, ':')"/>
       </xsl:if>
     </xsl:variable>

     <xsl:variable name="vrtfDoc">
      <xsl:element name="{$vPref}dummy"
                   namespace="{$vNewNSUri}"/>
     </xsl:variable>

     <xsl:copy-of select=
     "ext:node-set($vrtfDoc)/*/namespace::*[. = $vNewNSUri]"/>
   </xsl:for-each>

   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

जब यह परिवर्तन प्रदान किए गए 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>

वांछित, सही परिणाम उत्पन्न होता है :

<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:urn="urn:schemas-NEWSTRING-com:VARIABLESTRING">
  <soapenv:Header />
  <soapenv:Body>
    <requestMessage xmlns="urn:schemas-NEWSTRING-com:VARIABLESTRING">
      <merchantID>TESTID</merchantID>
    </requestMessage>
  </soapenv:Body>
</soapenv:Envelope>




xslt-grouping