gpt4 book ai didi

java - MD5 整个节点以及校验和

转载 作者:太空宇宙 更新时间:2023-11-04 09:54:18 26 4
gpt4 key购买 nike

我有一个业务要求:

  1. 将“Request”标签和子节点放入CDATA或xml字符串中。放入arg0元素
  2. 连接 <Request>节点和值来自 <Checkword> ,然后对其进行MD5。放入arg1

我能够做到第一个。但我不知道如何做第二个。

这是示例 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 是输出。我的问题是 arg1 的 md5 加密。我还在考虑如何处理它。

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>

最佳答案

使用 serialize()XSLT 3.0 样式表示例方法将 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>

关于java - MD5 整个节点以及校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54373090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com