XSL转换[SOAP]

时间:2018-04-02 08:25:28

标签: xslt integration soapui maximo inbound

任何人都可以帮我这个吗?我尝试使用xsl映射转换MAXIMO企业服务的响应,并且我已成功转换它,但问题是,当我提交请求时它不会返回任何数据。

这是我的xsl:

  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <SyncX1POMATREC>
            <X1POMATRECSet>
                <PO>
                    <SITEID>
                        <xsl:value-of select="string($var1_resultof_first/*[local-name()='SITEID' and namespace-uri()=''])"/>
                    </SITEID>
                    <PONUM>
                        <xsl:value-of select="PONUM"/>
                    </PONUM>
                    <REVISIONNUM>
                        <xsl:value-of select="REVISIONNUM"/>
                    </REVISIONNUM>
                    <POID>
                        <xsl:value-of select="POID"/>
                    </POID>
                    <RECEIPT>
                        <POLINENUM>
                            <xsl:value-of select="POLINENUM"/>
                        </POLINENUM>
                        <ITEMNUM>
                            <xsl:value-of select="ITEMNUM"/>
                        </ITEMNUM>
                    </RECEIPT>
                </PO>
            </X1POMATRECSet>
    </SyncX1POMATREC>
</xsl:template>

以下是回复:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <SyncX1POMATREC xmlns:xs="http://www.w3.org/2001/XMLSchema">
         <X1POMATRECSet>
            <PO>
               <SITEID/>
               <PONUM/>
               <REVISIONNUM/>
               <POID/>
               <RECEIPT>
                  <POLINENUM/>
                  <ITEMNUM/>
               </RECEIPT>
            </PO>
         </X1POMATRECSet>
      </SyncX1POMATREC>
   </soapenv:Body>
</soapenv:Envelope>

EDITED

这是来自SOAP的请求XML:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:max="http://www.ibm.com/maximo">
   <soapenv:Header/>
   <soapenv:Body>
      <max:SyncX1POMATREC>
         <max:X1POMATRECSet>
            <max:PO action="AddChange">
               <max:SITEID>BEDFORD</max:SITEID>
               <max:PONUM>TEST42</max:PONUM>
               <max:REVISIONNUM>0</max:REVISIONNUM>
            </max:PO>
         </max:X1POMATRECSet>
      </max:SyncX1POMATREC>
   </soapenv:Body>
</soapenv:Envelope> 

2 个答案:

答案 0 :(得分:1)

输入XML具有以下名称空间xmlns:max="http://www.ibm.com/maximo"xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/",这些名称空间未在XSLT中声明。您需要在XSLT中声明这些名称空间以访问关联的XML元素。

在XSLT中,需要使用为命名空间声明的前缀来访问元素,在这种情况下,它将是max,即max:SITEIDmax:PONUM,依此类推。

以下是修改后的XSLT。某些元素即。输入XML共享中不存在POIDPOLINENUMITEMNUM,因此输出中不会显示任何值。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:max="http://www.ibm.com/maximo" exclude-result-prefixes="soapenv max">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*" />

    <xsl:template match="max:PO">
        <SyncX1POMATREC>
            <X1POMATRECSet>
                <PO>
                    <SITEID><xsl:value-of select="max:SITEID" /></SITEID>
                    <PONUM><xsl:value-of select="max:PONUM" /></PONUM>
                    <REVISIONNUM><xsl:value-of select="max:REVISIONNUM" /></REVISIONNUM>
                    <POID><xsl:value-of select="POID" /></POID>
                    <RECEIPT>
                        <POLINENUM><xsl:value-of select="POLINENUM" /></POLINENUM>
                        <ITEMNUM><xsl:value-of select="ITEMNUM" /></ITEMNUM>
                    </RECEIPT>
                </PO>
            </X1POMATRECSet>
        </SyncX1POMATREC>
    </xsl:template>
</xsl:stylesheet>

输出

<SyncX1POMATREC>
    <X1POMATRECSet>
        <PO>
            <SITEID>BEDFORD</SITEID>
            <PONUM>TEST42</PONUM>
            <REVISIONNUM>0</REVISIONNUM>
            <POID />
            <RECEIPT>
                <POLINENUM />
                <ITEMNUM />
            </RECEIPT>
        </PO>
    </X1POMATRECSet>
</SyncX1POMATREC>

答案 1 :(得分:1)

另一种选择是使用class GetXyzResponseBean { @SuppressWarnings("unused") private final List<Foo> foos; public GetXyzResponseBean(List<Foo> foos) { this.foos = ... } 忽略命名空间,[local-name() =是原始问题的开头,直接使用//*元素:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <SyncX1POMATREC>
            <X1POMATRECSet>
                <PO>
                    <SITEID>
                        <xsl:value-of select="//*[local-name() = 'SITEID']"/>
                    </SITEID>
                    <PONUM>
                        <xsl:value-of select="//*[local-name() = 'PONUM']"/>
                    </PONUM>
                    <REVISIONNUM>
                        <xsl:value-of select="//*[local-name() = 'REVISIONNUM']"/>
                    </REVISIONNUM>
                    <POID>
                        <xsl:value-of select="//*[local-name() = 'POID']"/>
                    </POID>
                    <RECEIPT>
                        <POLINENUM>
                            <xsl:value-of select="//*[local-name() = 'POLINENUM']"/>
                        </POLINENUM>
                        <ITEMNUM>
                            <xsl:value-of select="//*[local-name() = 'ITEMNUM']"/>
                        </ITEMNUM>
                    </RECEIPT>
                </PO>
            </X1POMATRECSet>
        </SyncX1POMATREC>
    </xsl:template>
</xsl:stylesheet>