Tratando XML multiref en Biztalk

less than 1 minute read

Atacando un servicio desde Biztalk, me encontré con que este me devolvía el XML en un formato no aceptado por Biztalk. Tenía etiquetas multiref y esto no le gustaba.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:sendSmsSubmissionResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://mobicomp.com/smsexpress/webservice/server/message">
<sendSmsSubmissionReturn href="#id0" />
</ns1:sendSmsSubmissionResponse>
<multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:SubmissionStatus" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://mobicomp.com/smsexpress/webservice/server/message">
<id xsi:type="soapenc:string">4336723</id>
<message xsi:type="soapenc:string">Submisso enviada para processamento.</message>
<status href="#id1" />
</multiRef>
<multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="xsd:int" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">0</multiRef>
</soapenv:Body>
 </soapenv:Envelope>


Para poder tratarlo en Biztalk, tuve que desarollar un pequeño código XSL (stylesheet) que después introduje en la Pipeline de entrada custom para decodificarlo.

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
                xmlns:ns2="http://mobicomp.com/smsexpress/webservice/server/message">
<xsl:key name="multiref-by-id" match="multiRef" use="@id"/>
<xsl:template match="/">
<xsl:copy>
<xsl:apply-templates select="@* |*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(@href, '#')]">
    <xsl:copy>    
        <xsl:apply-templates select="@* |
             key('multiref-by-id', substring-after(@href, '#'))/@*[not(local-name()='id' or local-name()='type')] |
            key('multiref-by-id', substring-after(@href, '#'))/node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@href[starts-with(., '#')] | multiRef[@id] | @soapenc:root"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>


Una vez hecho esto, todo funcionó como la seda. Para el .xsl me inspiré en esta respuesta de StackOverflow

Leave a comment