SOAP的XSLT转换

时间:2015-10-18 06:12:28

标签: xslt

我有一个传入的SOAP消息,如下所示:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns3:GetImageResponse xmlns="urn:webservice/server/mobile/shoebox/types/v1/CustomImage" xmlns:ns2="urn:webservice/server/mobile/shoebox/types/v1/common/ShoeboxCommonArtifacts" xmlns:ns3="urn:webservice/server/mobile/shoebox/types/v1/Image" xmlns:ns4="urn:webservice/server/mobile/shoebox/types/v1/common/exceptions" xmlns:ns5="urn:webservice/server/mobile/shoebox/types/v1/GetThumbnailImage">
<ns3:returnCode>105</ns3:returnCode>
<ns3:errorText>Invalid Participant code/id.</ns3:errorText>
<ns3:shoeboxImage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</ns3:GetImageResponse>
</soap:Body>
</soap:Envelope>

需要转换为另一个简单的XML,如下所示:(约束 - SOAP信封BODY下的根元素(如果“GetImageResponse”即将到来,我们需要在输出XML中构造“GetImage”元素)并且它不是常量是任何元素因此需要根据BODY下的根元素构建XML,如下所示的Ex)

<?xml version="1.0" encoding="UTF-8"?>
<tns:GetImage xmlns:bons1="http://highmark.com/rbssvc/messages/common" xmlns:tns="http://www.example.org/GetImageResponseMessage/" xmlns:tns1="http://www.example.org/GetImageResponse/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/GetImageResponseMessage/ ../xsd/GetImageResponseMessage.xsd ">

 <payload>
    <returnCode>returnCode</returnCode>
    <errorText>errorText</errorText>
    <imageData>MA==</imageData>
  </payload>

我在XSLT下面使用这个来转换:

<xsl:stylesheet extension-element-prefixes="dp" exclude-result-prefixes="dp regex" version="1.0" xmlns:dp="http://www.datapower.com/extensions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:regex="http://exslt.org/regular-expressions">
   <xsl:template match="/">
      <GetImage>
         <xsl:element name="{'Payload'}">
            <xsl:copy-of select="/*/*[local-name()='Body']/*[local-name()='GetImageResponse']/*"/>
         </xsl:element>
      </GetImage>
   </xsl:template>
</xsl:stylesheet>

但我没有得到上面显示的所需XML输出

我得到的输出是:

<GetImageResponse>
   <Payload>
      <ns3:returnCode xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns5="urn:webservice/server/mobile/shoebox/types/v1/GetThumbnailImage" xmlns:ns4="urn:webservice/server/mobile/shoebox/types/v1/common/exceptions" xmlns:ns3="urn:webservice/server/mobile/shoebox/types/v1/Image" xmlns:ns2="urn:webservice/server/mobile/shoebox/types/v1/common/ShoeboxCommonArtifacts" xmlns="urn:webservice/server/mobile/shoebox/types/v1/CustomImage">105</ns3:returnCode>
      <ns3:errorText xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns5="urn:webservice/server/mobile/shoebox/types/v1/GetThumbnailImage" xmlns:ns4="urn:webservice/server/mobile/shoebox/types/v1/common/exceptions" xmlns:ns3="urn:webservice/server/mobile/shoebox/types/v1/Image" xmlns:ns2="urn:webservice/server/mobile/shoebox/types/v1/common/ShoeboxCommonArtifacts" xmlns="urn:webservice/server/mobile/shoebox/types/v1/CustomImage">Invalid Participant code/id.</ns3:errorText>
      <ns3:shoeboxImage xsi:nil="true" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns5="urn:webservice/server/mobile/shoebox/types/v1/GetThumbnailImage" xmlns:ns4="urn:webservice/server/mobile/shoebox/types/v1/common/exceptions" xmlns:ns3="urn:webservice/server/mobile/shoebox/types/v1/Image" xmlns:ns2="urn:webservice/server/mobile/shoebox/types/v1/common/ShoeboxCommonArtifacts" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:webservice/server/mobile/shoebox/types/v1/CustomImage"/>
   </Payload>
</GetImageResponse>

这里的问题就像我无法复制传入soap消息的名称空间一样,元素“GetImageResponse”和一些额外的命名空间也来自元素“payload”。enter code here

任何想法如何从SOAP消息转换为所需的XML输出。

快速回复表示赞赏。

此致 RJ

2 个答案:

答案 0 :(得分:0)

多余的xmlns声明是可视噪声,但在功能上不是问题。但是,您可以通过确保在生成的结果的根元素上设置必要的xmlns声明来解决此问题。在您的情况下,这是:print()

您会注意到,在样式表中,<GetImage>元素位于包含XSLT样式表的文档的默认名称空间中,该文档也未指定。

示例:

GetImage

接下来,您的<!-- namespace GetImage and set up additional namespace mapping for ns5 prefix for any copied elements which may be injected --> <tns:GetImage xmlns:tns="tns-uri" xmlns:ns5="ns5-uri"> <!-- more stuff here --> </tns:GetImage> 调用也不会注入命名空间。您可以使用xsl:element的<xsl:element name="{'Payload'}">属性将生成的元素与所需的命名空间(URI)相关联,也可以使用namespace属性中的{prefix}:{local-name}语法并添加适当的name声明。

示例:

xmlns:prefix

答案 1 :(得分:0)

你的问题并不完全清楚。我你想做这样的事情:

XSLT 1.0

private $method = null;

public function setPackageMethod($method)
{
    $this->method = $method;
}

public function runMethod()
{
    return $this->package->{$this->method}();
}

这是做什么的:

  1. 创建一个根本名称与其名称相同的根元素 $obj->setPackageMethod('hello'); echo $obj->runMethod(); // The method only will be run now 的子项,为其分配<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns3="urn:webservice/server/mobile/shoebox/types/v1/Image" xmlns:my="http://www.example.com/my" exclude-result-prefixes="soap ns3 my"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <my:ns-holder xmlns:bons1="http://highmark.com/rbssvc/messages/common" xmlns:tns1="http://www.example.org/GetImageResponse/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/GetImageResponseMessage/ ../xsd/GetImageResponseMessage.xsd "/> <xsl:template match="/soap:Envelope/soap:Body/*"> <xsl:element name="tns:{local-name()}" xmlns:tns="http://www.example.org/GetImageResponseMessage/"> <xsl:copy-of select="document('')/xsl:stylesheet/my:ns-holder/namespace::*"/> <payload> <returnCode> <xsl:value-of select="ns3:returnCode" /> </returnCode> <errorText> <xsl:value-of select="ns3:errorText" /> </errorText> <imageData>MA==</imageData> </payload> </xsl:element> </xsl:template> </xsl:stylesheet> 前缀并绑定。{1} soap:Body的前缀 命名空间。请注意,这假设只有一个这样的孩子。

  2. 将一堆命名空间添加到上面的根元素中。请注意这些 名称空间实际上并未在结果中使用 - 因此也是如此 完全是多余的。

  3. 创建有效负载及其值节点。请注意,您无法使用 tns:,因为那也会复制原始节点 命名空间(本例中为"http://www.example.org/GetImageResponseMessage/')。

  4. 应用于您的输入示例,此处的结果将为:

    xsl:copy here

    我不明白:

    • 究竟应该ns3转换为<?xml version="1.0" encoding="UTF-8"?> <tns:GetImageResponse xmlns:tns="http://www.example.org/GetImageResponseMessage/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns3="urn:webservice/server/mobile/shoebox/types/v1/Image" xmlns:my="http://www.example.com/my" xmlns:bons1="http://highmark.com/rbssvc/messages/common" xmlns:tns1="http://www.example.org/GetImageResponse/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <payload> <returnCode>105</returnCode> <errorText>Invalid Participant code/id.</errorText> <imageData>MA==</imageData> </payload> </tns:GetImageResponse> ;
    • GetImageResponse值(“MA ==”)应该来自哪里。