gpt4 book ai didi

xslt - 动态 XSLT 转换

转载 作者:行者123 更新时间:2023-12-04 19:53:10 26 4
gpt4 key购买 nike

我在下面有一个传入的简单 xml 请求,需要转换到具有正确 namespace 的 SOAP 消息下方。在传入的 XML 请求中, namespace 没有出现,因此在形成 SOAP 消息时,我们还需要处理 namespace 。是否有任何 XSLT 代码片段可以帮助我实现这一目标。
注意 - 我们需要动态地进行这个 XSLT 转换,就像传入的请求可以是像“GetImageRequest”这样的任何元素,所以需要基于这个元素构造命名空间。 (可能我们可以将所有的命名空间保存在一个xml文件中,并且需要构造SOAP消息)

传入的 XML 请求:

<request>
<payload>
<GetImageRequest>
<participantId>1191152220010</participantId>
<participantCode>131029</participantCode>
<groupCode>027198</groupCode>
<userType>EE</userType>
<clientName>Test</clientName>
<shoeboxID>123444</shoeboxID>
<imageID>45235</imageID>
</GetImageRequest>
</payload>
</request>

==================
需要在具有适当命名空间的 SOAP 消息下方构造。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>

</soapenv:Header>
<soapenv:Body>
<get:GetShoeboxItemRequest xmlns:get="urn:webservice/server/mobile/shoebox/types/v1/GetShoeboxItem">
<get:participantId>1060687620010</get:participantId>
<get:participantCode>1060687620010</get:participantCode>
<get:groupCode>027198</get:groupCode>
<get:userType>EE</get:userType>
<get:clientName>Test</get:clientName>
<get:shoeboxID>123444</get:shoeboxID>
</get:GetShoeboxItemRequest>
</soapenv:Body>
</soapenv:Envelope>

需要快速帮助。 XSLT 代码片段会有所帮助。

最佳答案

本次改造 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="pRequestedItemName" select="'Shoebox'"/>

<xsl:variable name="vUpper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="vLower" select="'abcdefghijklmnopqrstuvwxyz'"/>

<xsl:variable name="vLcItemName" select=
"translate($pRequestedItemName, $vUpper, $vLower)"/>

<xsl:variable name="vDynNamespace" select=
"concat('urn:webservice/server/mobile/', $vLcItemName, '/types/v1/Get', 'Item')"/>

<xsl:template match="/">
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
</soapenv:Header>
<soapenv:Body>
<xsl:element name="get:Get{$pRequestedItemName}ItemRequest"
namespace="{$vDynNamespace}">
<xsl:apply-templates select="/*/*/GetImageRequest/node()"/>
</xsl:element>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>

<xsl:template match="*">
<xsl:element name="get:{name()}" namespace="{$vDynNamespace}">
<xsl:copy-of select="namespace::*|@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

当应用于提供的源 XML 文档时 :
<request>
<payload>
<GetImageRequest>
<participantId>1191152220010</participantId>
<participantCode>131029</participantCode>
<groupCode>027198</groupCode>
<userType>EE</userType>
<clientName>Test</clientName>
<shoeboxID>123444</shoeboxID>
<imageID>45235</imageID>
</GetImageRequest>
</payload>
</request>

产生想要的、正确的结果 :
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<get:GetShoeboxItemRequest
xmlns:get="urn:webservice/server/mobile/shoebox/types/v1/GetItem">
<get:participantId>1191152220010</get:participantId>
<get:participantCode>131029</get:participantCode>
<get:groupCode>027198</get:groupCode>
<get:userType>EE</get:userType>
<get:clientName>Test</get:clientName>
<get:shoeboxID>123444</get:shoeboxID>
<get:imageID>45235</get:imageID>
</get:GetShoeboxItemRequest>
</soapenv:Body>
</soapenv:Envelope>

说明 :
  • 的全功率 <xsl:element> 指令被使用。
  • 使用 AVT ( Attribute Value Templates )
  • 动态命名空间的唯一可变部分应提供为 a global parameter 通过转换的调用者。

  • 如果你需要构造一个完全动态的命名空间(比如转换的调用者传入一个全局参数),见 this answer .

    更新 :

    OP 在评论中澄清说,他可以将所有特定于请求的命名空间收集在单独的 XML 文档或全局参数中。

    这是这个澄清问题的解决方案 :
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:param name="pRequestData">
    <r name="GetImageRequest"
    ns="urn:webservice/server/mobile/shoebox/types/v1/GetShoeboxItem"/>
    <r name="SaveShoeBoxitemRequest"
    ns="urn:webservice/server/mobile/shoebox/types/v1/SaveShoeboxItem"/>
    <r name="SaveClaimWithReceiptRequest"
    ns="urn:webservice/server/mobile/shoebox/types/v1/SaveClaimAndReceipt"/>
    <r name="GetThumbNailImageRequest"
    ns="urn:webservice/server/mobile/shoebox/types/v1/GetThumbnail"/>
    <r name="AttachReceiptwithExistingClaimRequest"
    ns="urn:webservice/server/mobile/shoebox/types/v1/AttachClaimAndReceipt"/>
    </xsl:param>

    <xsl:variable name="vParams" select="document('')/*/xsl:param[@name='pRequestData']"/>

    <xsl:template match="/">
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header>
    </soapenv:Header>
    <soapenv:Body>
    <xsl:apply-templates select="/*/*/*"/>
    </soapenv:Body>
    </soapenv:Envelope>
    </xsl:template>

    <xsl:template match="*">
    <xsl:param name="pKey" select="local-name()"/>
    <xsl:element name="get:{local-name()}" namespace="{$vParams/*[@name = $pKey]/@ns}">
    <xsl:copy-of select="namespace::*|@*"/>
    <xsl:apply-templates>
    <xsl:with-param name="pKey" select="$pKey"/>
    </xsl:apply-templates>
    </xsl:element>
    </xsl:template>
    </xsl:stylesheet>

    当此转换应用于以下 XML 文档时 (所提供的具有 payload 的第二个不同名称的 child ):
    <request>
    <payload>
    <GetImageRequest>
    <participantId>1191152220010</participantId>
    <participantCode>131029</participantCode>
    <groupCode>027198</groupCode>
    <userType>EE</userType>
    <clientName>Test</clientName>
    <shoeboxID>123444</shoeboxID>
    <imageID>45235</imageID>
    </GetImageRequest>
    <SaveShoeBoxitemRequest>
    <participantId>1191152220010</participantId>
    <participantCode>131029</participantCode>
    <groupCode>027198</groupCode>
    <userType>EE</userType>
    <clientName>Test</clientName>
    <shoeboxID>123444</shoeboxID>
    <imageID>45235</imageID>
    </SaveShoeBoxitemRequest>
    </payload>
    </request>

    产生了想要的、正确的(与其他答案中的“解决方案”不同)结果 :
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header/>
    <soapenv:Body>
    <get:GetImageRequest
    xmlns:get="urn:webservice/server/mobile/shoebox/types/v1/GetShoeboxItem">
    <get:participantId>1191152220010</get:participantId>
    <get:participantCode>131029</get:participantCode>
    <get:groupCode>027198</get:groupCode>
    <get:userType>EE</get:userType>
    <get:clientName>Test</get:clientName>
    <get:shoeboxID>123444</get:shoeboxID>
    <get:imageID>45235</get:imageID>
    </get:GetImageRequest>
    <get:SaveShoeBoxitemRequest
    xmlns:get="urn:webservice/server/mobile/shoebox/types/v1/SaveShoeboxItem">
    <get:participantId>1191152220010</get:participantId>
    <get:participantCode>131029</get:participantCode>
    <get:groupCode>027198</get:groupCode>
    <get:userType>EE</get:userType>
    <get:clientName>Test</get:clientName>
    <get:shoeboxID>123444</get:shoeboxID>
    <get:imageID>45235</get:imageID>
    </get:SaveShoeBoxitemRequest>
    </soapenv:Body>
    </soapenv:Envelope>

    关于xslt - 动态 XSLT 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33268598/

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