DataPower XSLT:将RFH Header字符串追加至XML适配MQ传输
问题解答
1. 能否直接将RFHHeader追加到规范XML顶部?
不行。当前的<Envelope>XML带有缩进、换行等格式空白,直接拼接后会引入多余的空格、换行符,和目标OUTPUT的紧凑格式不符。RFH Header需要紧跟压缩后的XML内容,中间不能有额外空白,直接追加原XML会破坏这种格式要求。
2. 是否有类似C# StringBuilder的方法?
XSLT中没有和StringBuilder完全一致的工具,但可以通过XML节点序列化+字符串拼接实现类似逻辑:先把<Envelope>节点转换为无空白的紧凑字符串,再和RFHHeader变量的内容拼接。
3. 具体解决方案
根据使用的XSLT版本,提供两种实现方式:
方案一:XSLT 2.0及以上版本(推荐)
利用serialize()函数直接将XML节点序列化为紧凑字符串,再拼接RFH Header:
<xsl:template match="/"> <!-- 序列化Envelope节点为无空白的XML字符串 --> <xsl:variable name="compactXml"> <xsl:sequence select="serialize(/*, map{'method':'xml', 'indent':false()})"/> </xsl:variable> <!-- 拼接RFHHeader和紧凑XML字符串 --> <xsl:value-of select="concat($RFHHeader, $compactXml)"/> </xsl:template>
方案二:XSLT 1.0版本
XSLT 1.0无内置序列化函数,需手动去除XML格式空白后拼接:
<xsl:template match="/"> <!-- 生成无空白的XML字符串 --> <xsl:variable name="compactXml"> <xsl:apply-templates select="/*" mode="strip-whitespace"/> </xsl:variable> <!-- 拼接内容 --> <xsl:value-of select="concat($RFHHeader, $compactXml)"/> </xsl:template> <!-- 去除文本节点中的空白(仅保留有效文本) --> <xsl:template match="text()" mode="strip-whitespace"> <xsl:value-of select="normalize-space(.)"/> </xsl:template> <!-- 复制元素节点及属性 --> <xsl:template match="*" mode="strip-whitespace"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates mode="strip-whitespace"/> </xsl:copy> </xsl:template>
额外注意事项
- 确保
RFHHeader变量内容无多余换行或空白,与目标格式一致。 - 如果MQ发送组件支持单独设置RFH Header(部分客户端允许分离消息头和消息体),优先采用这种方式,避免手动拼接字符串,更规范可靠。
内容的提问来源于stack exchange,提问作者Ram Adabala
相关产品推荐
相关产品推荐

