从xsl文件调用另一个文件并接收响应

时间:2017-02-01 16:37:03

标签: xml xslt soap

我需要从xsl文件调用另一个文件,它接收一些参数并返回一个必须添加的标记,如输出中所示,我必须从输入消息中获取参数

输入

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://ejemplo.com/servicios">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:Consultar>
         <headerIn>
            <dispositivo>01010101010101010101010101010101</dispositivo>
            <medio>010001</medio>
            <aplicacion>00006</aplicacion>
         </headerIn>
         <bodyIn>
            <field1>1790197948001</field1>
            <field2>0003</field12>
         </bodyIn>
      </ser:Consultar>
   </soapenv:Body>
</soapenv:Envelope>

我需要这个输出

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://ejemplo.com/servicios">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:Consultar>
         <headerIn>
            <dispositivo>01010101010101010101010101010101</dispositivo>
            <medio>010001</medio>
            <aplicacion>00006</aplicacion>
            <poli>
                <teller>1</teller>
                <terminal>3</terminal>
            </poli>
         </headerIn>
         <bodyIn>
            <field1>1790197948001</field1>
            <field2>0003</field12>
         </bodyIn>
      </ser:Consultar>
   </soapenv:Body>
</soapenv:Envelope>

我正在尝试使用此xsl代码

<xsl:stylesheet version="1.0" extension-element-prefixes="dp" exclude-result-prefixes="dp" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://www.example.org/tns" xmlns:dp="http://www.datapower.com/extensions">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="headerIn">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>

        <!-- here i need call another xsl file, I want send 2 parameters taked from input, and to  recibe tag poli -->
        <xsl:call-template name="prueba-call-template">
            <xsl:with-param name="param1" select="medio"/>
            <xsl:with-param name="param2" select="aplicacion"/>

        </xsl:call-template>
    </xsl:copy>
</xsl:template>

prueba的呼叫template.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0"
    xmlns:dp="http://www.datapower.com/extensions"
    xmlns:ser="http://ejemplo.com/servicios">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

    <xsl:param name="teller"/>
    <xsl:param name="terminal"/>

    <xsl:template match="/*">

      <xsl:variable name="result">
        <poli>
            <teller><xsl:value-of select="$teller"/></teller>
            <terminal><xsl:value-of select="$terminal"/></terminal>
        </poli>
      </xsl:variable>

    </xsl:template>
    <poli> <xsl:value-of select="$result"/></poli>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

您无法按照自己的想法调用另一个XSLT文件。但是,您可以在其他文件中包含XSLT文件,然后调用包含XSLT的模板。

首先,将prueba-call-template.xsl更改为此...

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0"
    xmlns:dp="http://www.datapower.com/extensions"
    xmlns:ser="http://ejemplo.com/servicios"
        exclude-result-prefixes="dp">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

    <xsl:template name="prueba">
        <xsl:param name="teller"/>
        <xsl:param name="terminal"/>
        <poli>
            <teller><xsl:value-of select="$teller"/></teller>
            <terminal><xsl:value-of select="$terminal"/></terminal>
        </poli>
    </xsl:template>
</xsl:stylesheet>

然后,您可以使用xsl:include语句将此XSLT包含在主XSLT中

<xsl:include href="prueba-call-template.xsl" />

您还需要更改xsl:call-template以使用正确的模板和参数名称(在当前的XSLT中,您使用参数调用它&#34; param1&#34;和&#34; param2&#34 ;但是你的第二个XSLT使用&#34; teller&#34;和&#34;终端&#34;)

 <xsl:call-template name="prueba">
     <xsl:with-param name="teller" select="medio"/>
     <xsl:with-param name="terminal" select="aplicacion"/>
 </xsl:call-template>

因此,您的主XSLT将如下所示:

<xsl:stylesheet version="1.0" extension-element-prefixes="dp" exclude-result-prefixes="dp" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://www.example.org/tns" xmlns:dp="http://www.datapower.com/extensions">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

<xsl:include href="prueba-call-template.xsl" />

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="headerIn">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>

        <xsl:call-template name="prueba">
            <xsl:with-param name="teller" select="medio"/>
            <xsl:with-param name="terminal" select="aplicacion"/>
        </xsl:call-template>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

请注意,两个XSLT都必须保存在同一位置。