MD5 целый узел вместе с контрольной суммой - PullRequest
0 голосов
/ 26 января 2019

У меня есть бизнес-требование:

  1. Поместить тег «Запрос» и дочерние узлы в строку CDATA или xml.вставьте элемент arg0
  2. Concat <Request> узел и значение из <Checkword>, затем выполните MD5 для него.положить в arg1

Я смог сделать 1-й.Но я понятия не имею, как сделать 2-й.

вот пример XML

<?xml version="1.0" encoding="UTF-8"?>
<ns0:MT_AddressValidation_Req><Request service="OrderFilterService" lang="zh-CN">
<Head>BSPdevelop</Head>
<Body>
<OrderFilter d_address="address"></OrderFilter>
</Body>
</Request>
<Checkword>f2209jdlwne1Q=</Checkword>
</ns0:MT_AddressValidation_Req>

Пока что с XSLT, который я сделал, вот вывод.моя проблема - шифрование md5 для arg1.Я все еще думаю о том, что с этим делать.

XSLT-вывод

<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><![CDATA[<Request lang="zh-CN" service="OrderFilterService"><Head>BSPdevelop</Head><Body><OrderFilter d_address="address"/></Body></Request>]]></arg0>
<arg1></arg1>
</ser:sfexpressService>
</soapenv:Body>
</soapenv:Envelope>

Код

<xsl:transform version="1.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">&lt;![CDATA[</xsl:text>
           <xsl:copy>
            <xsl:apply-templates/>
           </xsl:copy>
          <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
         </arg0>
         <arg1></arg1>
        </ser:sfexpressService>
      </soapenv:Body>
     </soapenv:Envelope>
   </xsl:template>
   <xsl:template match="/*">
    <xsl:copy-of select="Request"/>
   </xsl:template>
</xsl:transform>

Ожидайте, что в arg1 я смогу получитьхеш MD5

<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><![CDATA[<Request lang="zh-CN" service="OrderFilterService"><Head>BSPdevelop</Head><Body><OrderFilter d_address="address"/></Body></Request>]]></arg0>
<arg1>1309740fa1e193</arg1>
</ser:sfexpressService>
</soapenv:Body>
</soapenv:Envelope>

1 Ответ

0 голосов
/ 26 января 2019

Пример таблицы стилей 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">&lt;![CDATA[</xsl:text>
                        <xsl:copy>
                            <xsl:apply-templates/>
                        </xsl:copy>
                        <xsl:text disable-output-escaping="yes">]]&gt;</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">&lt;![CDATA[</xsl:text>
                        <xsl:copy>
                            <xsl:apply-templates/>
                        </xsl:copy>
                        <xsl:text disable-output-escaping="yes">]]&gt;</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>&lt;</xsl:text>
        <xsl:value-of select="name()"/>
        <xsl:apply-templates select="@*" mode="serialize" />
        <xsl:choose>
            <xsl:when test="node()">
                <xsl:text>&gt;</xsl:text>
                <xsl:apply-templates mode="serialize" />
                <xsl:text>&lt;/</xsl:text>
                <xsl:value-of select="name()"/>
                <xsl:text>&gt;</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text> /&gt;</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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...