Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SOAP的XSLT转换_Xslt - Fatal编程技术网

从SOAP的XSLT转换

从SOAP的XSLT转换,xslt,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/

我收到一条如下的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>

105
无效的参与者代码/id。


需要转换为另一个简单的XML,如下所示:(约束-SOAP信封主体下的根元素(例如-如果“GetImageResponse”出现,我们需要在输出XML中构造“GetImage”元素),它不是常量,可以是任何元素,因此需要基于主体下的根元素构造XML,例如,如下所示)


返回码
错误文本
妈==
我使用以下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>

105
无效的参与者代码/id。
这里的问题是,我无法复制传入soap消息(如元素“GetImageResponse”)的名称空间,元素“payload”也会有一些额外的名称空间

知道如何从SOAP消息转换为所需的XML输出吗

感谢快速回复

问候
Rj

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

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

例如:

<!-- 
     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>

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

XSLT1.0

<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>
我不明白:

  • 如何准确地将
    GetImageResponse
    转换为
    GetImage
  • 其中是应该来自的
    imageData
    值(“MA==”)
<xsl:element name="foo" namespace="bar"/>
<!-- needs xmlns:ns declaration -->
<xsl:element name="ns:foo"/>
<!--  substantially the same, using 'expressions' instead of 'literals' -->
<xsl:element name="{$nsPrefix}:{local-name()}">
<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>
<?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>