5

apply-templates私は以下のようなXSLTを持っており、要素内で使用したいので、" "XML要素の情報で要素xsl:for-eachを繰り返す必要はありません。<tr>cliente

私は試みていますが、を作成して中xsl:templateに入れることに成功していません。xsl:apply-templatesxsl:for-each

使用できることは知っていますが、内部または外部でxsl:call-template使用する方法はありますか?xsl:apply-templatesfor-each

これを行う方法について何かアイデアはありますか?

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
      <html>
         <head><title>Informações</title></head>
         <body>
            <h1>Relação de Clientes</h1>
            <table border="2">
               <tr bgcolor="LightBlue">
                  <th>Nome</th>
                  <th>Telefone</th>
                  <th>Cidade</th>
                  <th>Estado</th>
                  <th>Crédito</th>
               </tr>
               <tr>
                  <th colspan="6" bgcolor="LightPink">Critério usado abaixo: exibir todos os elementos ordenado por nome</th>
               </tr>
               <xsl:for-each select="informacoes/cliente">
               <xsl:sort select="nome" order="ascending" />
                  <tr>
                     <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td>
                     <td><xsl:value-of  select="telefone"/></td>
                     <td><xsl:value-of select="cidade"/></td>
                     <td><xsl:value-of select="estado"/></td>
                     <td><xsl:value-of select="credito"/></td>
                  </tr>
               </xsl:for-each>
               <tr>
                  <th colspan="6" bgcolor="LightCyan"> Critério usado abaixo: exibir os clientes da cidade do Rio de Janeiro</th>
               </tr>
               <xsl:for-each select="informacoes/cliente">
                   <xsl:if test="cidade='Rio de Janeiro'">
                      <tr>
                         <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td>
                         <td><xsl:value-of  select="telefone"/></td>
                         <td><xsl:value-of select="cidade"/></td>
                         <td><xsl:value-of select="estado"/></td>
                         <td><xsl:value-of select="credito"/></td>
                      </tr>
                    </xsl:if>
                </xsl:for-each>
               <tr>
                  <th colspan="6" bgcolor="LightYellow"> Critério usado abaixo:  exibir os clientes do estado do RJ com ordenado pelo nome; </th>
               </tr>
               <xsl:for-each select="informacoes/cliente">
               <xsl:sort select="nome" order="ascending" />
               <xsl:if test="estado='RJ'">
                  <tr>
                     <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td>
                     <td><xsl:value-of  select="telefone"/></td>
                     <td><xsl:value-of select="cidade"/></td>
                     <td><xsl:value-of select="estado"/></td>
                     <td><xsl:value-of select="credito"/></td>
                  </tr>
                </xsl:if>
                  </xsl:for-each>
               <tr>
                  <th colspan="6" bgcolor="LightYellow"> Critério usado abaixo:  exibir os clientes com crédito entre 250 e 400, em ordem descendente de crédito) </th>
               </tr>
               <xsl:for-each select="informacoes/cliente">
               <xsl:sort select="credito" order="descending" />
               <xsl:if test="credito&gt;250 and credito&lt;400">
                  <tr>
                     <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td>
                     <td><xsl:value-of  select="telefone"/></td>
                     <td><xsl:value-of select="cidade"/></td>
                     <td><xsl:value-of select="estado"/></td>
                     <td><xsl:value-of select="credito"/></td>
                  </tr>
                </xsl:if>
                  </xsl:for-each>
               </table>
            </body>
         </html>
      </xsl:template>
</xsl:stylesheet>
4

2 に答える 2

7

xsl:for-each繰り返し処理している場所の内部ではinformacoes/cliente、コンテキストノードが現在のcliente要素になります。

apply-templatesコンテキストノードを使用するために、selectステートメントで使用できます.例えば:

<xsl:for-each select="informacoes/cliente">
  <xsl:sort select="nome" order="ascending" />
  <xsl:apply-templates select="."/>
</xsl:for-each>

次に、cliente要素に一致するテンプレートを作成します。

<xsl:template match="informacoes/cliente">
    <tr>
        <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td>
        <td><xsl:value-of  select="telefone"/></td>
        <td><xsl:value-of select="cidade"/></td>
        <td><xsl:value-of select="estado"/></td>
        <td><xsl:value-of select="credito"/></td>
    </tr>
</xsl:template>

軸を使用して現在のコンテキストノードを参照し、コンテキストノードの述語フィルター内にテスト基準を適用すること<xsl:if>で、一部のアイテムを取り巻くテストを排除することもできます。self::

  <xsl:for-each select="informacoes/cliente">
     <xsl:sort select="nome" order="ascending" />
     <xsl:apply-templates select="self::*[estado='RJ']"/>
  </xsl:for-each>

これらの変更をサンプルスタイルシートに適用します。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <head><title>Informações</title></head>
            <body>
                <h1>Relação de Clientes</h1>
                <table border="2">
                    <tr bgcolor="LightBlue">
                        <th>Nome</th>
                        <th>Telefone</th>
                        <th>Cidade</th>
                        <th>Estado</th>
                        <th>Crédito</th>
                    </tr>
                    <tr>
                        <th colspan="6" bgcolor="LightPink">Critério usado abaixo: exibir todos os elementos ordenado por nome</th>
                    </tr>
                    <xsl:for-each select="informacoes/cliente">
                        <xsl:sort select="nome" order="ascending" />
                        <xsl:apply-templates select="."/>
                    </xsl:for-each>
                    <tr>
                        <th colspan="6" bgcolor="LightCyan"> Critério usado abaixo: exibir os clientes da cidade do Rio de Janeiro</th>
                    </tr>
                    <xsl:for-each select="informacoes/cliente">
                        <xsl:apply-templates select="self::*[cidade='Rio de Janeiro']"/>
                    </xsl:for-each>
                    <tr>
                        <th colspan="6" bgcolor="LightYellow"> Critério usado abaixo:  exibir os clientes do estado do RJ com ordenado pelo nome; </th>
                    </tr>
                    <xsl:for-each select="informacoes/cliente">
                        <xsl:sort select="nome" order="ascending" />
                        <xsl:apply-templates select="self::*[estado='RJ']"/>
                    </xsl:for-each>
                    <tr>
                        <th colspan="6" bgcolor="LightYellow"> Critério usado abaixo:  exibir os clientes com crédito entre 250 e 400, em ordem descendente de crédito) </th>
                    </tr>
                    <xsl:for-each select="informacoes/cliente">
                        <xsl:sort select="credito" order="descending" />
                        <xsl:apply-templates select="self::*[credito&gt;250 and credito&lt;400]"/>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="informacoes/cliente">
        <tr>
            <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td>
            <td><xsl:value-of  select="telefone"/></td>
            <td><xsl:value-of select="cidade"/></td>
            <td><xsl:value-of select="estado"/></td>
            <td><xsl:value-of select="credito"/></td>
        </tr>
    </xsl:template>
</xsl:stylesheet>   

Dimitre Novatchevの回答に示されているように、ステートメントを削除し、選択したxsl:for-eachステートメントを調整することで、スタイルシートをさらに簡素化できます。必要に応じてapply-templatesの内部をxsl:apply-templates適用して、選択した要素が目的の順序で処理されるようにします。xsl:sortcliente

<xsl:apply-templates select="informacoes/cliente[estado='RJ']">
  <xsl:sort select="nome" order="ascending" />
</xsl:apply-templates>
于 2012-09-17T00:45:49.200 に答える
3

交換するだけです:

           <xsl:for-each select="informacoes/cliente"> 
           <xsl:sort select="nome" order="ascending" /> 
              <tr> 
                 <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td> 
                 <td><xsl:value-of  select="telefone"/></td> 
                 <td><xsl:value-of select="cidade"/></td> 
                 <td><xsl:value-of select="estado"/></td> 
                 <td><xsl:value-of select="credito"/></td> 
              </tr> 
           </xsl:for-each> 

<xsl:apply-templates select="informacoes/cliente">
  <xsl:sort select="nome" order="ascending" />
</xsl:apply-templates>

同様に、:を置き換えます

           <xsl:for-each select="informacoes/cliente">       
               <xsl:if test="cidade='Rio de Janeiro'">       
                  <tr>       
                     <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td>       
                     <td><xsl:value-of  select="telefone"/></td>       
                     <td><xsl:value-of select="cidade"/></td>       
                     <td><xsl:value-of select="estado"/></td>       
                     <td><xsl:value-of select="credito"/></td>       
                  </tr>       
                </xsl:if>       
            </xsl:for-each>   

<xsl:apply-templates select="informacoes/cliente[cidade='Rio de Janeiro']"/>

同様に、:を置き換えます

           <xsl:for-each select="informacoes/cliente">           
           <xsl:sort select="nome" order="ascending" />           
           <xsl:if test="estado='RJ'">           
              <tr>           
                 <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td>           
                 <td><xsl:value-of  select="telefone"/></td>           
                 <td><xsl:value-of select="cidade"/></td>           
                 <td><xsl:value-of select="estado"/></td>           
                 <td><xsl:value-of select="credito"/></td>           
              </tr>           
            </xsl:if>           
              </xsl:for-each> 

と:

<xsl:apply-templates select="informacoes/cliente[estado='RJ']">
  <xsl:sort select="nome" order="ascending" />
</xsl:apply-templates>

そして最後に置き換えます:

           <xsl:for-each select="informacoes/cliente">               
           <xsl:sort select="credito" order="descending" />               
           <xsl:if test="credito&gt;250 and credito&lt;400">               
              <tr>               
                 <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td>               
                 <td><xsl:value-of  select="telefone"/></td>               
                 <td><xsl:value-of select="cidade"/></td>               
                 <td><xsl:value-of select="estado"/></td>               
                 <td><xsl:value-of select="credito"/></td>               
              </tr>               
            </xsl:if>               
              </xsl:for-each>  

<xsl:apply-templates select="informacoes/cliente[credito >250 and 400 > credito]">
  <xsl:sort select="credito" order="descending" />
</xsl:apply-templates>

次に、この単純なテンプレートを追加します

<xsl:template match="informacoes/cliente">
 <tr>               
  <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td>               
  <td><xsl:value-of  select="telefone"/></td>               
  <td><xsl:value-of select="cidade"/></td>               
  <td><xsl:value-of select="estado"/></td>               
  <td><xsl:value-of select="credito"/></td>               
 </tr>               
</xsl:template> 

これで、完全なXSLTコードは次のようになります

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
      <html>
         <head><title>Informações</title></head>
         <body>
            <h1>Relação de Clientes</h1>
            <table border="2">
               <tr bgcolor="LightBlue">
                  <th>Nome</th>
                  <th>Telefone</th>
                  <th>Cidade</th>
                  <th>Estado</th>
                  <th>Crédito</th>
               </tr>
               <tr>
                  <th colspan="6" bgcolor="LightPink">Critério usado abaixo: exibir todos os elementos ordenado por nome</th>
               </tr>
                             <xsl:apply-templates select="informacoes/cliente">
                              <xsl:sort select="nome" order="ascending" />
                             </xsl:apply-templates>
                             <tr>
                  <th colspan="6" bgcolor="LightCyan"> Critério usado abaixo: exibir os clientes da cidade do Rio de Janeiro</th>
               </tr>
                 <xsl:apply-templates select="informacoes/cliente[cidade='Rio de Janeiro']"/>
                 <tr>
                  <th colspan="6" bgcolor="LightYellow"> Critério usado abaixo:  exibir os clientes do estado do RJ com ordenado pelo nome; </th>
               </tr>
                             <xsl:apply-templates select="informacoes/cliente[estado='RJ']">
                              <xsl:sort select="nome" order="ascending" />
                             </xsl:apply-templates>
               <tr>
                  <th colspan="6" bgcolor="LightYellow"> Critério usado abaixo:  exibir os clientes com crédito entre 250 e 400, em ordem descendente de crédito) </th>
               </tr>
                             <xsl:apply-templates select="informacoes/cliente[credito >250 and 400 > credito]">
                              <xsl:sort select="credito" order="descending" />
                             </xsl:apply-templates>
              </table>
            </body>
         </html>
      </xsl:template>

            <xsl:template match="informacoes/cliente">
             <tr>
              <td bgcolor="LightGreen"><xsl:value-of  select="nome"/></td>
              <td><xsl:value-of  select="telefone"/></td>
              <td><xsl:value-of select="cidade"/></td>
              <td><xsl:value-of select="estado"/></td>
              <td><xsl:value-of select="credito"/></td>
             </tr>
            </xsl:template>
</xsl:stylesheet>
于 2012-09-17T01:42:34.077 に答える