使用XSLT在SOAP信封中添加SOAP头

使用XSLT在SOAP信封中添加SOAP头,xslt,Xslt,我有一个传入的SOAP消息,其中没有SOAP头标记,我需要在其中添加SOAP头。我使用这个XSLT来做这件事,但是没有添加SOAP头。 XSLT: incomig SOAP mesagge可以有标题标签,也可以没有标题标签 输入不带标头标记的SOAP消息: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <hm

我有一个传入的SOAP消息,其中没有SOAP头标记,我需要在其中添加SOAP头。我使用这个XSLT来做这件事,但是没有添加SOAP头。 XSLT:


incomig SOAP mesagge可以有标题标签,也可以没有标题标签

输入不带标头标记的SOAP消息:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <hmhs-medical-acknowledgement id="4080186649" result="FAIL""/>
   </soapenv:Body>
</soapenv:Envelope>

所需的输出SOAP消息:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
<UUID>71A4B2FA029D412787B06E07685ED101</UUID>
</soapenv:Header>
   <soapenv:Body>
      <hmhs-medical-acknowledgement id="4080186649" result="FAIL""/>
   </soapenv:Body>
</soapenv:Envelope>

71A4B2FA029D412787B06E07685ED101

AFAICT,您要执行以下操作:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.datapower.com/extensions" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
extension-element-prefixes="dp">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="uuid" select="dp:variable('var://context/txn/uuid')" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/soapenv:Envelope">
    <xsl:copy>
        <soapenv:Header>
            <UUID><xsl:value-of select="$uuid"/></UUID>
        </soapenv:Header>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="soapenv:Header"/>

</xsl:stylesheet>


请发布一个XML输入和预期输出的示例。-提示:如果输入没有SOAP头,那么您的第二个模板将永远不会执行。嗨,Michael,输入SOAP消息:请不要在注释中发布代码-改为编辑您的问题。嗨,Michael,很抱歉,我已经更新了我的问题,添加了传入的SOAP消息和必需的输出SOAP消息。请告诉我如何获得必需的结果Hanks Michael,此解决方案工作正常。我有另一个问题,比如有一段时间我得到了一个空的标题标签,比如“”。所以在这种情况下,这是行不通的。如果没有“”标记,则此代码有效。我们如何对“:tag是否存在进行条件检查,并基于此,我们可以选择fortemplate match=“/soapenv:Envelope”或“template match=“/soapenv:Header”您能否帮助我们编写此内容。请编辑您的问题并显示一个标题为空的输入示例。嗨,Michael,我已经添加了两个可能的传入SOAP消息,一个类似于带头标记的消息,另一个在SOAP消息中没有头标记。消费者正在发送一些时间标题标签,但有时它不会出现。请告诉我如何获得所需的结果。Michael,是的,它工作正常。非常感谢你的帮助。我会接受这个答案来结束它。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
<UUID>71A4B2FA029D412787B06E07685ED101</UUID>
</soapenv:Header>
   <soapenv:Body>
      <hmhs-medical-acknowledgement id="4080186649" result="FAIL""/>
   </soapenv:Body>
</soapenv:Envelope>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.datapower.com/extensions" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
extension-element-prefixes="dp">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="uuid" select="dp:variable('var://context/txn/uuid')" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/soapenv:Envelope">
    <xsl:copy>
        <soapenv:Header>
            <UUID><xsl:value-of select="$uuid"/></UUID>
        </soapenv:Header>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="soapenv:Header"/>

</xsl:stylesheet>