該轉化:
<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。
UPDATE:
的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文檔(所提供的一個具有的第二,不同名稱的孩子)施加這種轉變:
<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>
「*基於此元素上需要構建名字空間* 「這還不夠清楚。請提供一個確切的規則來構建命名空間。我沒有看到'GetImageRequest'成爲'urn:webservice/server/mobile/shoebox/types/v1/GetShoeboxItem''的邏輯。 --- P.S.是[你的其他問題](http://stackoverflow.com/questions/33194911/xslt-transformation-from-soap)回答? –