Пример таблицы стилей XSLT 3.0 , которая использует метод serialize()
для сериализации элемента Request в виде строки, а затем использует общедоступную службу REST для получения MD5хэш значения, переданного в параметре строки запроса.
Поскольку этот сервис REST не возвращает правильно сформированный XML, ему необходимо использовать метод unparsed-text()
.Вы можете разместить аналогичную службу, которая возвращает правильно сформированный XML-ответ, а затем использовать document()
.
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/">
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.expressservice.integration.sf.com/">
<soapenv:Header/>
<soapenv:Body>
<ser:sfexpressService>
<arg0>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</arg0>
<arg1>
<xsl:apply-templates mode="hash"/>
</arg1>
</ser:sfexpressService>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>
<xsl:template match="/*">
<xsl:copy-of select="Request"/>
</xsl:template>
<xsl:template match="/*" mode="hash">
<xsl:variable name="val" select="concat(Request, heckword)"/>
<!-- delegate to an external REST service to calculate the MD5 hash of the value -->
<xsl:variable name="hash-val"
select="unparsed-text(concat('https://helloacm.com/api/md5/?s=', encode-for-uri($val)))"/>
<!-- the response from this service is wrapped in quotes, so need to trim those off -->
<xsl:value-of select="substring($hash-val, 2, string-length($hash-val) - 2)"/>
</xsl:template>
</xsl:transform>
С другим процессором XSLT 2.0 вам потребуется функция расширения.для сериализации, или вы можете запустить контент через шаблоны в режиме «сериализации»:
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no" omit-xml-declaration="yes"/>
<xsl:template match="/">
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.expressservice.integration.sf.com/">
<soapenv:Header/>
<soapenv:Body>
<ser:sfexpressService>
<arg0>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</arg0>
<arg1>
<xsl:apply-templates mode="hash"/>
</arg1>
</ser:sfexpressService>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>
<xsl:template match="/*">
<xsl:copy-of select="Request"/>
</xsl:template>
<xsl:template match="/*" mode="hash">
<!-- generate the serialized form of the Request -->
<xsl:variable name="serialized-request">
<xsl:apply-templates select="Request" mode="serialize"/>
</xsl:variable>
<xsl:variable name="val" select="concat($serialized-request, heckword)"/>
<!-- delegate to an external REST service to calculate the MD5 hash of the value -->
<xsl:variable name="hash-val" select="unparsed-text(concat('https://helloacm.com/api/md5/?s=', encode-for-uri($val)))"/>
<!-- the response from this service is wrapped in quotes, so need to trim those off -->
<xsl:value-of select="substring($hash-val, 2, string-length($hash-val) - 2)"/>
</xsl:template>
<xsl:template match="*" mode="serialize">
<xsl:text><</xsl:text>
<xsl:value-of select="name()"/>
<xsl:apply-templates select="@*" mode="serialize" />
<xsl:choose>
<xsl:when test="node()">
<xsl:text>></xsl:text>
<xsl:apply-templates mode="serialize" />
<xsl:text></</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>></xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> /></xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@*" mode="serialize">
<xsl:text> </xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>="</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"</xsl:text>
</xsl:template>
<xsl:template match="text()" mode="serialize">
<xsl:value-of select="."/>
</xsl:template>
</xsl:transform>