8

XSLT ノードを使用しています。私の質問は XSL についてです。インターネットで検索しましたが、Web ページに表示するための XML 処理に関する情報しか見つかりませんでした。私が探している情報は、このシナリオで一部のコードを「再利用」する方法です。

私のXSLは:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:wsb="http://tempuri.org/">

    <xsl:import href="HubGenerico.xsl" />

    <xsl:template match="/RCECSTD2">
        <xsl:element name="soap:Envelope">
            <xsl:element name="soap:Header" />
            <xsl:element name="soap:Body" />

            <xsl:choose>

                <xsl:when test="STDR2_DATOS_CONTROL/STDR2_CODOPE = 1010">
                    <xsl:element name="wsb:ConsultarSC">
                        <xsl:element name="wsb:codigoOperacion">
                            <xsl:value-of select="STDR2_DATOS_CONTROL/STDR2_CODOPE" />
                        </xsl:element>
                        <xsl:element name="wsb:numeroOperacion">
                            <xsl:value-of select="STDR2_DATOS_CONTROL/STDR2_NUMOPEBCO" />
                        </xsl:element>
                        <xsl:element name="wsb:codigoBanco">
                            <xsl:value-of select="STDR2_DATOS_EMPRESA/STDR2_CODBCO" />
                        </xsl:element>
                        <xsl:element name="wsb:codigoConvenio">
                            <xsl:value-of select="STDR2_DATOS_EMPRESA/STDR2_CODCONTR" />
                        </xsl:element>
                        <xsl:element name="wsb:numeroReferenciaDeuda">
                            <xsl:value-of
                                select="normalize-space(STDR2_DATOS_TRANSACCION/STDR2_NUMREF_DEUDA)" />
                        </xsl:element>
                        <xsl:element name="wsb:canalOperacion">
                            <xsl:value-of select="STDR2_DATOS_OPERACION/STDR2_CANAL" />
                        </xsl:element>
                        <xsl:element name="wsb:codigoOficina">
                            <xsl:value-of select="STDR2_DATOS_OPERACION/STDR2_CODOFI" />
                        </xsl:element>
                        <xsl:element name="wsb:fechaOperacion">
                            <xsl:value-of select="STDR2_DATOS_OPERACION/STDR2_FECOPE" />
                        </xsl:element>
                        <xsl:element name="wsb:horaOperacion">
                            <xsl:value-of select="STDR2_DATOS_OPERACION/STDR2_HOROPE" />
                        </xsl:element>
                        <xsl:element name="wsb:datosEmpresa" />
                    </xsl:element>
                </xsl:when>

                <xsl:when test="STDR2_DATOS_CONTROL/STDR2_CODOPE = 2010">
                    <xsl:element name="wsb:NotificarPago">
                        <xsl:element name="wsb:codigoOperacion">
                            <xsl:value-of select="STDR2_DATOS_CONTROL/STDR2_CODOPE" />
                        </xsl:element>
                        <xsl:element name="wsb:numeroOperacion">
                            <xsl:value-of select="STDR2_DATOS_CONTROL/STDR2_NUMOPEBCO" />
                        </xsl:element>
                        <xsl:element name="wsb:codigoBanco">
                            <xsl:value-of select="STDR2_DATOS_EMPRESA/STDR2_CODBCO" />
                        </xsl:element>
                        <xsl:element name="wsb:codigoConvenio">
                            <xsl:value-of select="STDR2_DATOS_EMPRESA/STDR2_CODCONTR" />
                        </xsl:element>
                        <xsl:element name="wsb:otrosDatosEmpresa" />
                        <xsl:element name="wsb:numeroReferenciaDeuda">
                            <xsl:value-of
                                select="normalize-space(STDR2_DATOS_TRANSACCION/STDR2_NUMREF_DEUDA)" />
                        </xsl:element>
                        <xsl:element name="wsb:NumDocDeuda">
                            <xsl:text>1</xsl:text>
                        </xsl:element>
                        <xsl:element name="wsb:formaPago">
                            <xsl:value-of select="STDR2_DATOS_TRANSACCION/STDR2_FORPAG" />
                        </xsl:element>
                        <xsl:element name="wsb:codigoMoneda">
                            <xsl:value-of select="STDR2_DATOS_TRANSACCION/STDR2_CODMON" />
                        </xsl:element>
                        <xsl:element name="wsb:importeTotalPagado">
                            <xsl:variable name="importeTotalPagado">
                                <xsl:call-template name="string-replace">
                                    <xsl:with-param name="text"
                                        select="string(STDR2_DATOS_TRANSACCION/STDR2_IMPTOT_PAG)" />
                                    <xsl:with-param name="pattern" select="'.'" />
                                    <xsl:with-param name="replace-with" select="''" />
                                </xsl:call-template>
                            </xsl:variable>
                            <xsl:value-of select="$importeTotalPagado" />
                        </xsl:element>
                        <xsl:element name="wsb:detallePagoBBVA" />
                        <xsl:element name="wsb:canalOperacion">
                            <xsl:value-of select="STDR2_DATOS_OPERACION/STDR2_CANAL" />
                        </xsl:element>
                        <xsl:element name="wsb:codigoOficina">
                            <xsl:value-of select="STDR2_DATOS_OPERACION/STDR2_CODOFI" />
                        </xsl:element>
                        <xsl:element name="wsb:fechaOperacion">
                            <xsl:value-of select="STDR2_DATOS_OPERACION/STDR2_FECOPE" />
                        </xsl:element>
                        <xsl:element name="wsb:horaOperacion">
                            <xsl:value-of select="STDR2_DATOS_OPERACION/STDR2_HOROPE" />
                        </xsl:element>
                        <xsl:element name="wsb:datosEmpresa" />
                    </xsl:element>
                </xsl:when>

            </xsl:choose>

        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

作成された要素の一部が「繰り返されている」(同じコード) ことがわかりますが、それらの親は異なります (ConsultarSCNotificarPago)。したがって、私の質問は、その「繰り返しコード」を再利用する方法です。「参照」(ESQL など) を使用できる「タグ」が存在するかどうかはわかりません。

4

3 に答える 3

15

あなたの例では、「名前付き」テンプレートはあなたの友達です。たとえば、同じ 2 つの要素を異なる場所に作成する場合は、次のように名前付きテンプレートを作成します。

 <xsl:template name="exampleTemplate">
    <xsl:element name="wsb:codigoOperacion">
        <xsl:value-of select="STDR2_DATOS_CONTROL/STDR2_CODOPE" />
    </xsl:element>
    <xsl:element name="wsb:numeroOperacion">
        <xsl:value-of select="STDR2_DATOS_CONTROL/STDR2_NUMOPEBCO" />
    </xsl:element>
 </xsl:template>

次に、これら 2 つの要素を作成するには、次のようにテンプレートを呼び出します。

<xsl:call-template name="exampleTemplate" />

以上です!

関数と同様に、テンプレートにもパラメーターを渡すことができます。

<xsl:template name="example">
    <xsl:param name="value" />
    Value is <xsl:value-of select="$value" />
</xsl:template>

<xsl:call-template name="example">
    <xsl:with-param name="value" select="element" />
</xsl:call-template>

余談ですが、静的な名前を使用している場合は、要素を作成するためにxsl:elementを使用する必要はありません。要素名を直接書き出すだけです。だから、これの代わりに

    <xsl:element name="wsb:numeroOperacion">
        <xsl:value-of select="STDR2_DATOS_CONTROL/STDR2_NUMOPEBCO" />
    </xsl:element>

これをするだけ

    <wsb:numeroOperacion>
        <xsl:value-of select="STDR2_DATOS_CONTROL/STDR2_NUMOPEBCO" />
    </wsb:numeroOperacion>
于 2013-03-29T21:58:19.860 に答える
0

「JLRishe」と「Tim C」に感謝します。XSL ファイルの結果は次のようになります。

主要:

`

<xsl:import href="HubGenerico.xsl" />
<xsl:variable name="myns" select="'http://tempuri.org/'" />

<xsl:template match="/RCECSTD2">
    <soap:Envelope>
        <soap:Header />
        <soap:Body />
        <xsl:variable name="codOperacion" select="STDR2_DATOS_CONTROL/STDR2_CODOPE" />
        <xsl:choose>
            <xsl:when test="$codOperacion = 1010">
                <wsb:ConsultarSC xmlns:wsb="'http://tempuri.org/'">
                    <xsl:call-template name="STDR2_DATOS_CONTROL">
                        <xsl:with-param name="ns" select="$myns" />
                    </xsl:call-template>
                    <xsl:call-template name="STDR2_DATOS_EMPRESA">
                        <xsl:with-param name="ns" select="$myns" />
                    </xsl:call-template>
                    <wsb:numeroReferenciaDeuda>
                        <xsl:value-of
                            select="normalize-space(STDR2_DATOS_TRANSACCION/STDR2_NUMREF_DEUDA)" />
                    </wsb:numeroReferenciaDeuda>
                    <xsl:call-template name="STDR2_DATOS_OPERACION">
                        <xsl:with-param name="ns" select="$myns" />
                    </xsl:call-template>
                    <wsb:datosEmpresa />
                </wsb:ConsultarSC>
            </xsl:when>

            <xsl:when test="$codOperacion = 2010">
                <wsb:NotificarPago xmlns:wsb="$ns">
                    <xsl:call-template name="STDR2_DATOS_CONTROL">
                        <xsl:with-param name="ns" select="$myns" />
                    </xsl:call-template>
                    <xsl:call-template name="STDR2_DATOS_EMPRESA">
                        <xsl:with-param name="ns" select="$myns" />
                    </xsl:call-template>
                    <wsb:otrosDatosEmpresa />
                    <wsb:numeroReferenciaDeuda>
                        <xsl:value-of
                            select="normalize-space(STDR2_DATOS_TRANSACCION/STDR2_NUMREF_DEUDA)" />
                    </wsb:numeroReferenciaDeuda>
                    <wsb:NumDocDeuda>
                        <xsl:text>1</xsl:text>
                    </wsb:NumDocDeuda>
                    <wsb:formaPago>
                        <xsl:value-of select="STDR2_DATOS_TRANSACCION/STDR2_FORPAG" />
                    </wsb:formaPago>
                    <wsb:codigoMoneda>
                        <xsl:value-of select="STDR2_DATOS_TRANSACCION/STDR2_CODMON" />
                    </wsb:codigoMoneda>
                    <wsb:importeTotalPagado>
                        <xsl:variable name="importeTotalPagado">
                            <xsl:call-template name="string-replace">
                                <xsl:with-param name="text"
                                    select="string(STDR2_DATOS_TRANSACCION/STDR2_IMPTOT_PAG)" />
                                <xsl:with-param name="pattern" select="'.'" />
                                <xsl:with-param name="replace-with" select="''" />
                            </xsl:call-template>
                        </xsl:variable>
                        <xsl:value-of select="$importeTotalPagado" />
                    </wsb:importeTotalPagado>
                    <wsb:detallePagoBBVA />
                    <xsl:call-template name="STDR2_DATOS_OPERACION">
                        <xsl:with-param name="ns" select="$myns" />
                    </xsl:call-template>
                    <wsb:datosEmpresa />
                </wsb:NotificarPago>
            </xsl:when>
        </xsl:choose>
    </soap:Envelope>
</xsl:template>

`

インポートされた XSL:

`

<xsl:template name="string-replace">
    <xsl:param name="text" />
    <xsl:param name="pattern" />
    <xsl:param name="replace-with" />
    <xsl:choose>
        <xsl:when test="contains($text, $pattern)">
            <xsl:value-of select="substring-before($text, $pattern)" />
            <xsl:value-of select="$replace-with" />
            <xsl:call-template name="string-replace">
                <xsl:with-param name="text"
                    select="substring-after($text, $pattern)" />
                <xsl:with-param name="pattern" select="$pattern" />
                <xsl:with-param name="replace-with" select="$replace-with" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<!-- Datos de Control -->
<xsl:template name="STDR2_DATOS_CONTROL">
    <xsl:param name="ns" />
    <xsl:variable name="datControl" select="STDR2_DATOS_CONTROL" />
    <xsl:element name="wsb:codigoOperacion" namespace="{$ns}">
        <xsl:value-of select="$datControl/STDR2_CODOPE" />
    </xsl:element>
    <xsl:element name="wsb:numeroOperacion" namespace="{$ns}">
        <xsl:value-of select="$datControl/STDR2_NUMOPEBCO" />
    </xsl:element>
</xsl:template>

<!-- Datos de Empresa -->
<xsl:template name="STDR2_DATOS_EMPRESA">
    <xsl:param name="ns" />
    <xsl:variable name="datEmpresa" select="STDR2_DATOS_EMPRESA" />
    <xsl:element name="wsb:codigoBanco" namespace="{$ns}">
        <xsl:value-of select="$datEmpresa/STDR2_CODBCO" />
    </xsl:element>
    <xsl:element name="wsb:codigoConvenio" namespace="{$ns}">
        <xsl:value-of select="$datEmpresa/STDR2_CODCONTR" />
    </xsl:element>
</xsl:template>

<!-- Datos de Operacion -->
<xsl:template name="STDR2_DATOS_OPERACION">
    <xsl:param name="ns" />
    <xsl:variable name="datOperacion" select="STDR2_DATOS_OPERACION" />
    <xsl:element name="wsb:canalOperacion" namespace="{$ns}">
        <xsl:value-of select="$datOperacion/STDR2_CANAL" />
    </xsl:element>
    <xsl:element name="wsb:codigoOficina" namespace="{$ns}">
        <xsl:value-of select="$datOperacion/STDR2_CODOFI" />
    </xsl:element>
    <xsl:element name="wsb:fechaOperacion" namespace="{$ns}">
        <xsl:value-of select="$datOperacion/STDR2_FECOPE" />
    </xsl:element>
    <xsl:element name="wsb:horaOperacion" namespace="{$ns}">
        <xsl:value-of select="$datOperacion/STDR2_HOROPE" />
    </xsl:element>
</xsl:template>

`

于 2013-03-31T18:12:08.917 に答える