velocity-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From cbris...@apache.org
Subject svn commit: r1854714 [4/8] - in /velocity/site/cms/trunk/content/engine/2.1: ./ apidocs/ css/ images/ images/logos/ translations/
Date Sun, 03 Mar 2019 13:56:00 GMT
Added: velocity/site/cms/trunk/content/engine/2.1/translations/user-guide_es.html
URL: http://svn.apache.org/viewvc/velocity/site/cms/trunk/content/engine/2.1/translations/user-guide_es.html?rev=1854714&view=auto
==============================================================================
--- velocity/site/cms/trunk/content/engine/2.1/translations/user-guide_es.html (added)
+++ velocity/site/cms/trunk/content/engine/2.1/translations/user-guide_es.html Sun Mar  3 13:56:00 2019
@@ -0,0 +1,2285 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+
+
+
+
+
+
+
+
+
+<html>
+  <head>
+    <title>Apache Velocity - Guía del Usuario de Velocity</title>
+    <style type="text/css" media="all">
+      @import url("../css/maven-base.css");
+      @import url("../css/maven-theme.css");
+      @import url("../css/site.css");
+    </style>
+    <link rel="stylesheet" href="../css/print.css" type="text/css" media="print" />
+    <link rel="alternate" href="http://feeds.feedburner.com/ApacheVelocitySiteNews" type="application/rss+xml" title="Apache Velocity - Guía del Usuario de Velocity News" />
+          <meta name="author" content="Velocity Documentation Team" />
+          <meta name="author" content="John Castura" />
+          <meta name="author" content="Juan Pablo Morales" />
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+      </head>
+  <body class="composite">
+    <div id="banner">
+                  <a href="../../" id="bannerLeft">
+    
+                                            <img src="../images/velocity_project_wide.png" alt="" />
+    
+            </a>
+                          <span id="bannerRight">
+    
+                                            <img src="../images/velocity-logo.png" alt="" />
+    
+            </span>
+            <div class="clear">
+        <hr/>
+      </div>
+    </div>
+    <div id="breadcrumbs">
+          
+  
+
+  
+    
+  
+  
+    
+            <div class="xleft">
+          
+          <a href="http://www.apache.org/">Apache</a>
+              &gt;
+      
+          <a href="../../../">Velocity</a>
+              &gt;
+      
+          <a href="../">Velocity Engine</a>
+                </div>
+            <div class="xright">      <a href="../">Engine</a>
+          |
+          <a href="../../../tools/devel/">Tools</a>
+          |
+          <a href="../../../anakia/devel/">Anakia</a>
+          |
+          <a href="../../../texen/devel/">Texen</a>
+          |
+          <a href="../../../docbook/">DocBook</a>
+          |
+          <a href="../../../dvsl/devel/">DVSL</a>
+          
+  
+
+  
+    
+  
+  
+    
+  </div>
+      <div class="clear">
+        <hr/>
+      </div>
+    </div>
+    <div id="leftColumn">
+      <div id="navcolumn">
+           
+  
+
+  
+    
+  
+  
+    
+                   <h5>Velocity</h5>
+        <ul>
+              
+    <li class="none">
+              <a href="../index.html">General</a>
+        </li>
+              
+    <li class="none">
+              <a href="../overview.html">Overview</a>
+        </li>
+              
+    <li class="none">
+              <a href="../getting-started.html">Getting Started</a>
+        </li>
+              
+    <li class="none">
+              <a href="../webapps.html">Web Applications</a>
+        </li>
+              
+    <li class="none">
+              <a href="../../../download.cgi">Download</a>
+        </li>
+              
+    <li class="none">
+              <a href="http://wiki.apache.org/velocity/VelocityFAQ">FAQ (Wiki)</a>
+        </li>
+          </ul>
+          <h5>Docs</h5>
+        <ul>
+              
+    <li class="none">
+              <a href="../user-guide.html">User Guide</a>
+        </li>
+              
+    <li class="none">
+              <a href="../developer-guide.html">Developer Guide</a>
+        </li>
+              
+    <li class="none">
+              <a href="../vtl-reference-guide.html">VTL Reference</a>
+        </li>
+              
+    <li class="none">
+              <a href="../glossary.html">Glossary</a>
+        </li>
+          </ul>
+          <h5>Developers</h5>
+        <ul>
+              
+    <li class="none">
+              <a href="../license.html">License</a>
+        </li>
+              
+    <li class="none">
+              <a href="../apidocs/index.html">Javadoc</a>
+        </li>
+              
+    <li class="none">
+              <a href="../changes-report.html">Changes</a>
+        </li>
+              
+    <li class="none">
+              <a href="../jira-report.html">Resolved Issues</a>
+        </li>
+              
+    <li class="none">
+              <a href="../upgrading.html">Upgrading</a>
+        </li>
+              
+    <li class="none">
+              <a href="../jar-dependencies.html">Dependencies</a>
+        </li>
+              
+    <li class="none">
+              <a href="http://svn.apache.org/viewvc/velocity/engine/trunk/">Source Code Repository</a>
+        </li>
+              
+    <li class="none">
+              <a href="../build.html">Building from Source</a>
+        </li>
+          </ul>
+          <h5>Community</h5>
+        <ul>
+              
+    <li class="none">
+              <a href="http://wiki.apache.org/velocity/">Wiki</a>
+        </li>
+              
+    <li class="none">
+              <a href="../../../news.html">Recent News</a>
+        </li>
+              
+    <li class="none">
+              <a href="http://wiki.apache.org/velocity/PoweredByVelocity">Powered By Velocity</a>
+        </li>
+              
+    <li class="none">
+              <a href="http://wiki.apache.org/velocity/VelocityEditors">IDE/Editor Plugins</a>
+        </li>
+              
+    <li class="none">
+              <a href="http://wiki.apache.org/velocity/PublishedArticlesAndBooks">Articles and Books</a>
+        </li>
+              
+    <li class="none">
+              <a href="http://wiki.apache.org/velocity/GetInvolved">Get Involved</a>
+        </li>
+              
+    <li class="none">
+              <a href="../../../contact.html">Mailing Lists</a>
+        </li>
+          </ul>
+          <h5>Velocity Development</h5>
+        <ul>
+              
+    <li class="none">
+              <a href="http://wiki.apache.org/velocity/RoadMap">Road Map</a>
+        </li>
+              
+    <li class="none">
+              <a href="http://wiki.apache.org/velocity/CodeStandards">Coding Standards</a>
+        </li>
+              
+    <li class="none">
+              <a href="http://wiki.apache.org/velocity/DocumentationGuidelines">Documentation Guidelines</a>
+        </li>
+              
+    <li class="none">
+              <a href="https://issues.apache.org/jira/browse/VELOCITY">Issues</a>
+        </li>
+              
+    <li class="none">
+              <a href="../../../who-we-are.html">Who we are</a>
+        </li>
+          </ul>
+          <h5>Translations</h5>
+        <ul>
+              
+    <li class="none">
+              <a href="http://www.jajakarta.org/velocity/">Site (Japanese)</a>
+        </li>
+              
+    <li class="none">
+              <a href="../translations/user-guide_fi.html">User's Guide (Finnish)</a>
+        </li>
+              
+    <li class="none">
+              <a href="../translations/user-guide_fr.html">User's Guide (French)</a>
+        </li>
+              
+    <li class="none">
+              <strong>User's Guide (Spanish)</strong>
+        </li>
+          </ul>
+          <h5>Project Documentation</h5>
+        <ul>
+              
+                
+              
+      
+            
+      
+            
+      
+            
+      
+            
+      
+              
+        <li class="collapsed">
+              <a href="../project-info.html">Project Information</a>
+              </li>
+              
+                
+              
+      
+            
+      
+            
+      
+            
+      
+            
+      
+            
+      
+            
+      
+            
+      
+            
+      
+            
+      
+            
+      
+              
+        <li class="collapsed">
+              <a href="../project-reports.html">Project Reports</a>
+              </li>
+          </ul>
+                                             
+                        
+                        
+                        <a class="poweredBy" href="../../../" title="Apache Velocity" ><img class="poweredBy" alt="Apache Velocity" src="../images/pbv90x30.png" /></a>
+                                
+                        
+                        
+                        <a class="poweredBy" href="../../../rss/news.rss" title="Velocity News Feed" ><img class="poweredBy" alt="Velocity News Feed" src="../images/feed-icon-24x24.jpg" /></a>
+                    
+       <iframe src="http://www.apache.org/ads/buttonbar.html"
+               style="border-width:0; float: left" frameborder="0" scrolling="no"
+               width="135"
+               height="265" ></iframe>
+
+           
+  
+
+  
+    
+  
+  
+    
+        </div>
+    </div>
+    <div id="bodyColumn">
+      <div id="contentBox">
+        <div class="section"><h2><a name="Tabla_de_Contenidos"></a>Tabla de Contenidos</h2>
+<ol type="1"><li><a href="#Acercadeestaguía">Acerca de esta guía</a></li>
+<li><a href="#¿QuéesVelocity?">¿Qué es Velocity?</a></li>
+<li><a href="#¿QuépuedehacerVelocitypormi?">¿Qué puede hacer Velocity por mi?</a><ol type="1"><li><a href="#ElEjemplodelatiendadeLodo">El Ejemplo de la tienda de
+            Lodo</a></li>
+</ol>
+</li>
+<li><a href="#ElLenguajedePlantillasdeVelocity(VTL):UnaIntroducción">El Lenguaje de Plantillas de Velocity (VTL): Una Introducción</a></li>
+<li><a href="#¡HolaMundoVelocity!">¡Hola Mundo Velocity!</a></li>
+<li><a href="#Comentarios">Comentarios</a></li>
+<li><a href="#Referencias">Referencias</a><ol type="1"><li><a href="#Variables">Variables</a></li>
+<li><a href="#Propiedades">Propiedades</a></li>
+<li><a href="#Métodos">Métodos</a></li>
+</ol>
+</li>
+<li><a href="#NotaciónFormaldeReferencias">Notación Formal de Referencias</a></li>
+<li><a href="#NotaciónSileciosadeReferencias">Notación Sileciosa de Referencias</a></li>
+<li><a href="#Literalmente">Literalmente</a><ol type="1"><li><a href="#Dinero">Dinero</a></li>
+<li><a href="#EscapandoReferenciasVTLVálidas">Escapando Referencias VTL Válidas</a></li>
+</ol>
+</li>
+<li><a href="#SustitucióndeMayúsculasyMinúsculas">Sustitución de Mayúsculas y Minúsculas</a></li>
+<li><a href="#Directivas">Directivas</a><ol type="1"><li><a href="#Set">Set</a></li>
+<li><a href="#CadenasdeCaracteres">Cadenas de Caracteres</a></li>
+<li><a href="#SentenciasIf-Else">Sentencias If-Else</a><ol type="1"><li><a href="#OperadoresLógicosyRelacionales">Operadores Lógicos y Relacionales</a></li>
+</ol>
+</li>
+<li><a href="#CiclosForeach">Ciclos Foreach</a></li>
+<li><a href="#Include">Include</a></li>
+<li><a href="#Parse">Parse</a></li>
+<li><a href="#Stop">Stop</a></li>
+<li><a href="#Velocimacros">Velocimacros</a></li>
+</ol>
+</li>
+<li><a href="#EscapandoDirectivasVTL">Escapando Directivas VTL</a></li>
+<li><a href="#VTL:AsuntosdeFormato">VTL: Asuntos de Formato</a></li>
+<li><a href="#OtrasCaracterísticasyMiscelánea">Otras Características y Miscelánea</a><ol type="1"><li><a href="#Matemáticas">Matemáticas</a></li>
+<li><a href="#ElOperadordeRango">El Operador de Rango</a></li>
+<li><a href="#TemasAvanzados:Escapandoy!">Temas Avanzados: Escapando y !</a></li>
+<li><a href="#MisceláneadeVelocimacro">Miscelánea de Velocimacro</a></li>
+<li><a href="#ConcatenacióndeCadenas">Concatenación de Cadenas</a></li>
+</ol>
+</li>
+<li><a href="#Retroalimentación">Retroalimentación</a></li>
+</ol>
+</div>
+<div class="section"><h2><a name="Acerca_de_esta_guía"></a>Acerca de esta guía</h2>
+<p>
+La Guía del usuario de Velocity busca ayudar a los diseñadores de páginas y a
+los proveedores de contenido a sentirse a gusto con Velocity y con la sintáxis
+de su simple pero poderoso lenguaje de script, el Lenguaje de Plantillas de
+Velocity (VTL por sus siglas en inglés).  Muchos de los ejemplos de esta guía
+muestran como usar Velocity para incluir contenidos dinámicos en sitios web,
+pero todos los ejemplos de VTL son igualmente aplicables a otras páginas y
+plantillas.
+</p>
+<p>Gracias por escoger Velocity!</p>
+</div>
+<div class="section"><h2><a name="aQué_es_Velocity"></a>¿Qué es Velocity?</h2>
+<p>
+Velocity es un motor de plantillas basado en Java. Le permite a los diseñadores
+de páginas hacer referencia a métodos definidos dentro del código Java. Los
+diseñadores Web pueden trabajar en paralelo con los programadores Java para
+desarrollar sitios de acuerdo al modelo de Modelo-Vista-Controlador (MVC),
+permitiendo que los diseñadores se concentren únicamente en crear un sitio bien
+diseñado y que los programadores se encarguen solamente de escribir código de
+primera calidad. Velocity separa el código Java de las páginas Web, haciendo el
+sitio más mantenible a largo plazo y presentando una alternativa viable a <a href="http://java.sun.com/products/jsp/" class="externalLink">Java Server Pages</a> (JSP) o <a href="http://www.php.net" class="externalLink">PHP</a>.
+</p>
+<p>
+Velocity se puede utilizar para crear páginas web, SQL, PostScript y cualquier
+otro tipo de salida de plantillas. Se puede utilizar como una aplicación
+independiente para generar código fuente y reportes, o como un componente
+integrado en otros sistemas. Cuando este completo Velocity proveerá servicios
+para el conjunto de aplicaciones web de <a href="http://jakarta.apache.org/turbine" class="externalLink">Turbine</a>.  Velocity+Turbine
+proveerá un servicio de plantillas que facilitará el desarrollo de aplicaciones
+web de acuerdo a un verdadero modelo MVC.
+</p>
+</div>
+<div class="section"><h2><a name="aQué_puede_hacer_Velocity_por_mi"></a>¿Qué puede hacer Velocity por mi?</h2>
+<div class="section"><h3><a name="El_Ejemplo_de_la_tienda_de_Lodo"></a>El Ejemplo de la tienda de Lodo</h3>
+<p>
+Suponga que usted es un diseñador para una tienda en línea que se especializa
+en vender lodo a la que llamaremos &quot;La Tienda de Lodo en línea&quot;. Los negocios
+están muy bien. Sus clientes ordenan diferentes tipos y cantidades de
+lodo.
+Ellos ingresan en su sitio con su nombre de usuario y su clave secreta, lo que
+les permite ver sus órdenes y pedir más lodo. En estos momentos el Lodo
+Terracota, que es muy popular, esta en oferta. Una minoría de sus clientes
+usualmente compra Lodo Rojo Brillante, que también esta en oferta, pero no es
+tan popular y usualmente esta relegado al márgen de su página web. La
+información sobre cada cliente esta dentro de su base de datos por lo que surge
+la pregunta: ¿Por qué no usar Velocity para enfocar las ofertas especiales para
+los clientes que están más interesados en ciertas clases de lodo?
+</p>
+<p>
+Velocity hace fácil el personalizar las páginas para sus visitantes.  Como un
+diseñador dentro de &quot;El Cuarto de Lodo&quot;, usted quiere crear la página que sus
+usuarios verán después de entrar a su sitio.
+</p>
+<p>
+Usted se encuentra con los ingenieros de su compañía, y todos acuerdan que
+<em>$cliente</em> contendrá la información pertienente al cliente que está
+dentro de la página en un momento dado, que <em>$lodosEnOferta</em> contendrá
+todos los tipos de lodo que están en oferta hoy en día.  Además, el objeto
+<em>$flogger</em> contendrá métodos para ayudar con la promoción. Para la tarea
+actual, solo se utilizarán estas tres referencias. Recuerde, usted no necesita
+preocuparse por como los ingenieros de software extraen la información
+necesaria de la base de datos; sólo tiene que saber que funciona. Esto le
+permite a usted continuar con su trabajo a la vez que deja a los ingenieros
+hacer el de ellos.
+</p>
+<p>Usted podría incluir el siguiente código VTL dentro de su página:</p>
+<div class="source"><pre>
+
+&lt;HTML&gt;
+&lt;BODY&gt;
+Hello $cliente.Nombre!
+&lt;table&gt;
+#foreach( $lodo in $lodosEnOferta )
+#if ( $cliente.haComprado($lodo) )
+&lt;tr&gt;
+&lt;td&gt;
+$flogger.obtenerPromocion( $lodo )
+&lt;/td&gt;
+&lt;/tr&gt;
+#end
+#end
+&lt;/table&gt;
+
+</pre>
+</div>
+<p>
+Los detalles exactos de la sentencia <i>foreach</i> serán descritos en
+profundidad próximamente; lo que es importante es el impacto que este pequeño
+script pueda tener en su sitio.  Cuando un cliente con una debilidad por el
+Lodo Rojo Brillante ingrese, si el Lodo Rojo Brillante esta en oferta, eso
+será lo que el cliente verá, de manera prominente. Si otro cliente, con una
+historia larga de compras de Lodo Terracota ingresa, entonces para él la
+noticia de un rebaja de Lodo Terracota estará en un lugar muy importante. La
+flexibilidad de Velocity es enorme y sólo esta limitada por su creatividad.
+</p>
+<p>
+En la  referencia de VTL están documentados muchos otros elementos de Velocity
+que, colectivamente le dan el poder y la flexibilidad que usted necesita para
+hacer de su sitio en la red una <em>presencia</em> en la red. A medida que
+usted se familiarice con estos elementos usted comenzará a aprovechar el poder
+de Velocity.
+</p>
+</div>
+</div>
+<div class="section"><h2><a name="El_Lenguaje_de_Plantillas_de_Velocity_VTL:_Una_Introducción"></a>El Lenguaje de Plantillas de Velocity (VTL): Una Introducción</h2>
+<p>
+  El Lenguaje de Plantillas de Velocity (VTL) fue creado para prover la
+  manera mas fácil, simple y limpia de incorporar contenido dinámico
+  dentro de una página web. Incluso un desarrollador de páginas web con
+  poca y ninguna experiencia puede rápidamente ser capaz de utilizar VTL
+  para incluir contenido dinámico en un sitio web.
+ </p>
+<p>
+    VTL usa <em>referencias</em> para incluir contenido dinámico dentro
+    de un sitio web. Una variable es un tipo de referencia que puede
+    referirse a algo definido dentro del código Java o obtener su valor
+    de un <em>enunciado</em> VTL en la página misma. A continuación hay
+    un ejemplo de un enunciado VTL que se puede incluir en un documento
+    HTML:
+ </p>
+<div class="source"><pre>
+#set( $a = &quot;Velocity&quot; )
+</pre>
+</div>
+<p>
+    Este enunciado VTL, como todos los enunciados VTL comienza con el
+    caracter <em>#</em> y contiene una directiva: <em>set</em>. Cuando
+    un visitante solicita su página, el Motor de Plantillas de Velocity
+    buscará dentro del contenido de su página y encontrará todos los
+    símbolos <em>#</em>, para luego determinar cuáles marcan el comienzo
+    de enunciados VTL y cuáles no tienen nada que ver con VTL.
+ </p>
+<p>
+ El caracter <em>#</em> viene seguido por una directiva <em>set</em>.
+ La directiva <em>set</em> utiliza una expresión (encerrada entre
+ paréntesis) -- una ecuación que asigna un <em>valor</em> a una
+ <em>variable</em>.
+ La variable se encuentra en el lado derecho y el valor está en el lado
+ izquierdo; los dos se encuentran separados por un signo igual
+ (<em>=</em>).
+ </p>
+<p>
+ En el ejemplo en la parte superior, la variable es <em>$a</em> y el
+ valor es <em>Velocity</em>. Esta variable, al igual que todas las
+ referencias, comienza con el caracter <em>$</em>. Los valores siempre
+ se encuentran ente comillas; con Velocity no hay confusión acerca de
+ los tipos de datos, ya que solamente cadenas (información basada en
+ texto) pueden ser pasados a las variables.
+ </p>
+<p>
+ La siguiente regla puede ser útil para entender mejor como funciona
+ Velocity: <strong>Las Referencias comienzan con <em>$</em> y se
+     utilizan para obtener algo. Las directivas comienzan con <em>#</em>
+     y se utilizan para hacer algo</strong></p>
+<p>
+ En el ejemplo anterior <em>#set</em> se utilizó para asignarle un valor
+ a una variable. La variable, <em>$a</em>, puede utilizarse dentro de la
+ plantilla para escribir la palabara &quot;Velocity&quot;.
+ </p>
+</div>
+<div class="section"><h2><a name="aHola_Mundo_Velocity"></a>¡Hola Mundo Velocity!</h2>
+<p>
+    Una vez un valor ha sido asignado a una variable, usted puede
+    referenciar la variable en cualquier lugar dentro del documento
+    HTML. En el ejemplo siguiente, un valor es asignado a la variable
+    <em>$foo</em>, que luego es referenciada.
+ </p>
+<div class="source"><pre>
+&lt;html&gt;
+&lt;body&gt;
+#set( $foo = &quot;Velocity&quot; )
+¡Hola Mundo $foo!
+&lt;/body&gt;
+&lt;html&gt;
+</pre>
+</div>
+<p>
+ El resultado es una página web que imprime &quot;¡Hola Mundo Velocity!&quot;
+ </p>
+<p>
+ Para hacer los enunciados con directivas VTL más legibles, nosotros le
+ recomendamos comenzar cada enunciado VTL en una nueva línea, aunque
+ usted no esta obligado a hacerlo así. La directiva <em>set</em> ser
+ verá con mayor detalle más adelante.
+ </p>
+</div>
+<div class="section"><h2><a name="Comentarios"></a>Comentarios</h2>
+<p>
+Los comentarios es posible incluir texto que no aparecerá como parte de
+la salida del motor de plantillas. Los comentarios sirven para recordar
+e indicar a otros que es lo que están haciendo los enunciados VTL, o
+para cualquier otro propósito que usted considere útil. A continuación
+hay un ejemplo de un comentario de VTL.
+</p>
+<div class="source"><pre>
+## Este es un comentario de una sola línea
+</pre>
+</div>
+<p>
+    Un comentario de una sola línea comienza con <em>##</em> y termina
+    al final de la línea. Si usted desea escribir varias líneas de
+    comentario no es necesario tener numerosos comentarios de una sóla
+    línea. Los comentarios de varias líneas, que comienzan con
+    <em>#*</em> y terminan con <em>*#</em> le permiten manejar
+    fácilmente esta situación.
+ </p>
+<div class="source"><pre>
+ Este es un texto que esta fuera de un comentario de múltiples líneas.
+ Los visitantes de su página lo pueden ver.
+
+#*
+ He aquí un comentario de varias líneas. Los visitantes
+ de su sitio no verán esto, ya que el Motor de Plantillas
+ de Velocity lo ignorará
+*#
+
+Aquí hay texto fuera del comentario, este si es visible.
+</pre>
+</div>
+<p>
+    A continuación hay algunos ejemplos para aclarar como funcionan
+    los comentarios de una y varias líneas:
+ </p>
+<div class="source"><pre>
+Este texto es visible. ## Este no lo es
+Este texto es visible.
+Este texto es visible. #* Este texto, como parte de un comentario de
+varias líneas, no es visible. Este texto no es visible; tambiés es parte
+del comentario. Este texto aún no es visible. *# Este texto esta fuera
+del comentario, por lo que es visible.
+## Este texto no es visible.
+</pre>
+</div>
+<p>
+    Existe un tercer tipo de comentario, el bloque de comentario VTL,
+    que puede ser utilizado para almacenar datos como el autor y la
+    información de versiones:
+</p>
+<div class="source"><pre>
+#**
+Este es un bloque de comentario VTL y
+puede utilizarse para almacenar datos
+como el nombre del autor y la
+información de versiones:
+@author
+@version 5
+*#
+</pre>
+</div>
+</div>
+<div class="section"><h2><a name="Referencias"></a>Referencias</h2>
+<p>
+    Existen tres tipos de referencias en VTL: variables, propiedades y
+    métodos. Como un diseñador que utilizar VTL, usted y sus ingenieros
+    deben llegar a un acuerdo respecto a los nombres de las referencias
+    para que usted pueda utilizarlas correctamente en sus plantillas.
+ </p>
+<p>
+    Todo lo que entra y sale de una referencia se trata como una cadena
+    de caracteres (un objeto String). Si existe un objeto que representa
+    <em>$foo</em> (por ejemplo, un objeto Integer), entonces Velocity
+    llamará el método <code>.toString()</code> de ese objeto para
+    convertirlo en una cadena de caracteres.
+ </p>
+<p><a name="Variables"><strong>Variables</strong></a><br />
+
+    La notación breve de una variable esta compuesta por un signo &quot;$&quot;
+    inicial seguido de un <em>Identificador</em>. Un identificador VTL
+    debe comenzar con un caracter alfabético (a .. z ó A .. Z). El resto
+    de los caracteres deb ser de alguno de los siguiente tipos:
+ </p>
+<p><ul><li>alfabético (a .. z, A .. Z)</li>
+<li>numérico (0 .. 9)</li>
+<li>línea (&quot;-&quot;)</li>
+<li>underscore (&quot;_&quot;)</li>
+</ul>
+</p>
+<p>
+    A continuación hay algunos ejemplos de referencias válidas en VTL:
+ </p>
+<div class="source"><pre>
+$foo
+$lanzaLodo
+$lanza-lodo
+$lanza_lodo
+$lanzaLodo1
+</pre>
+</div>
+<p>
+    Cuando VTL hace referencia una variable, po ejemplo, <em>$foo</em>,
+    la variable puede obtener su valor de una directiva <em>set</em>
+    dentro de la plantilla, o del código Java. Por ejemplo, si la
+    variable de Java <em>$foo</em> tiene el valor <em>bar</em> en el
+    momento en que se solicita la plantilla, entonces <em>bar</em>
+    reemplaza todas las ocurrencias (o instancias) de <em>$foo</em>
+    dentro de la página web. De manera alterna, si se incluye el
+    enunciado
+ </p>
+<div class="source"><pre>
+#set( $foo = &quot;bar&quot; )
+</pre>
+</div>
+<p>
+    La salida será la misma para todas las instancias de <em>$foo</em>
+    que se encuentren a continuación es esta directiva.
+ </p>
+<p><a name="Propiedades"><strong>Propiedades</strong></a><br />
+
+    El segundo sabor de referencias VTL son las propiedades; las
+    propiedades tienen un formato particular. La versión corta se
+    compone de un signo <em>$</em> seguido de un identificador VTL,
+    seguido de un punto y de otro identificador VTL. A continuación hay
+    ejemplos de referencias de propiedades válidas en VTL:
+ </p>
+<div class="source"><pre>
+$cliente.Direccion
+$compra.Total
+</pre>
+</div>
+<p>
+    Tome el primer ejemplo, <em>$cliente.Direccion</em>. Puede tener dos
+    significados. Puede significar, Busque en la tabla de hashing
+    identificada como <em>cliente</em> y devuelva el valor asociado con
+    la llave <em>Direccion</em>. Pero <em>$customer.Address</em> puede
+    también referirse a un método (las referencias que se relacionan con
+    métodos se discutirán en la sección siguiente);
+    <em>$customer.Address</em> puede ser una manera corta de escribir
+    <em>$customer.getAddress()</em>. Cuando su página sea solicitada
+    Velocity determinará cuál de las dos posibilidades tiene sentido, y
+    luego devolverá el valor apropiado.
+ </p>
+<p><a name="Métodos"><strong>Methods</strong></a><br />
+
+    Un método esta definido dentro del código de Java y es capaz de
+    hacer algo útil, como desarrollar un cálculo o llegar a una
+    decisión. Los métodos son referencias compuestas de un signo &quot;$&quot;
+    inicial seguido en un identificador VTL, seguido de un <em>Cuerpo de
+        Método</em> VTL. Un cuerpo de método VTL, a su vez esta formado
+    por un identificador VTL seguido por un paréntesis izquierdo (&quot;(&quot;),
+    seguido, opcionalmente, por una lista de parámetros, para terminar
+    en un paréntesis derecho. A continuación hay ejemplos de referencias
+    de métodos válidas dentro de VTL:
+
+ </p>
+<div class="source"><pre>
+$cliente.getDireccion()
+$compra.getTotal()
+$pagina.setTitulo( &quot;My Página Principal&quot; )
+$persona.establecerAtributos( [&quot;Extraño&quot;, &quot;Raro&quot;, &quot;Excitado&quot;] )
+</pre>
+</div>
+<p>
+    Los primeros dos ejemplos -- <em>$cliente.getDireccion()</em> y
+    <em>$compra.getTotal()</em> -- pueden parecer similares a aquellos
+    utilizados en la sección de propiedades, <em>$cliente.Direccion</em>
+    y <em>$compra.Total</em>. Si usted supuso que estos ejemplos están
+    relacionados de alguna manera, usted esta en lo cierto.
+ </p>
+<p>
+    Las Propiedades VTL pueden utilizarse como notación abreviada para
+    los métodos de VTL. La propiedad <em>$cliente.Direccion</em> tiene
+    exactamente el mismo efecto que el método
+    <em>$cliente.getDireccion()</em> (Nótese el uso de la palabra
+    inglesa <em>get</em> en lugar de la castellana <em>obtener</em>).
+    Generalmente es preferible utilizar una Propiedad si esta
+    disponible. La diferencia principal entre las propiedades y los
+    métodos es que usted le puede dar una lista de parámetros a un
+    Método.
+ </p>
+<p>
+ La notación breve se puede utilizar en los Métodos siguientes:
+ </p>
+<div class="source"><pre>
+$sol.getPlanetas()
+$anhelido.getMugre()
+$album.getFoto()
+</pre>
+</div>
+<p>
+    Podríamos esperar que estos métodos devolvieran los nombres de los
+    planetas que giran alrededor del sol, alimentaran un gusano de
+    tierra y extrajeran una foro de un album. Los siguientes Métodos
+    solo se pueden referenciar por medio de la notación larga:
+ </p>
+<div class="source"><pre>
+$sol.getPlaneta( [&quot;Tierra&quot;, &quot;Marte&quot;, &quot;Neptuno&quot;] )
+## No es posible pasar una lista de parámetros con $sun.Planets
+
+$sisifo.empujarPiedra()
+## Si dijera $sisifo.piedra Velocity asumiría $sisifo.pushPiedra()
+
+$libro.setTitulo( &quot;Homenaje a Colombia&quot; )
+## No se puede pasar un parámetro en la notación abreviada.
+</pre>
+</div>
+<p><a name="NotaciónFormaldeReferencias"><strong>Notación Formal de
+         Referncias</strong></a><br />
+
+ La notación abreviada para referencias fue utilizada en los ejemplos
+ anteriores, pero también existe una notación formal para referencias,
+ que se demuestra a continuación:
+ </p>
+<div class="source"><pre>
+${lanzaLodo}
+${cliente.Direccion}
+${compra.getTotal()}
+</pre>
+</div>
+<p>
+Casi en todos los casos usted utilizará la notación abreviada, pero
+existen escenarios en los cuales la notación formal se requiere para
+procesar corectamente la plantilla.
+ </p>
+<p>
+ Suponga que usted estuviera creando una frase en la que <em>$vicio</em>
+ se utilizará como prefijo para el ajetivo de una clase. La idea es
+ permitir a alguién escoger la palabra base para producir uno de los dos
+ siguientes resultados: &quot;Juan es un pirómano.&quot; ó &quot;Juan es un
+ cleptómano.&quot;. En este caso la notación abreviada no es apropiada;
+ considere el siguiente ejemplo:
+ </p>
+<div class="source"><pre>
+Juan is a $viciomano.
+</pre>
+</div>
+<p>
+Hay ambigüedad aquí, y Velocity asume que <em>$viciomano</em>, no
+<em>$vicio</em>, es el Identificador que usted quería utilizar. Al no
+encontrar ningún valor para <em>$viciomano</em> Velocity escribirá
+simplemente <em>$viciomano</em>. Este problema se resueklve usando
+notación formal.
+ </p>
+<div class="source"><pre>
+Juan es un ${vicio}mano.
+</pre>
+</div>
+<p>
+    Ahora Velocity save que la referencia es <em>$vicio</em> y no
+    <em>$viciomano</em>. La notación formal es útil cuando las
+    referencias están ubicadas directamente al lado del texto dentro de
+    una plantilla.
+ </p>
+<p><a name="NotaciónSileciosadeReferencias"><strong>Notación de Referenias
+         Silenciosas</strong></a><br />
+
+    Cuando Velocity encuentra una referencia indefinida, su
+    comportamiento normal es es de escribir el nombre de la referencia.
+    Por ejemplo, suponga que la siguiente referencia aparece como parte
+    de una plantilla VTL.
+ </p>
+<div class="source"><pre>
+&lt;input type=&quot;text&quot; name=&quot;correo&quot; value=&quot;$correo&quot;/&gt;
+</pre>
+</div>
+<p>
+    Cuando el formulario se carga por primera vez la referencia
+    <em>$correo</em> no tiene valor, pero usted probablemente preferiría
+    un texto en blanco a uno con el valor de &quot;$correo&quot;. Usando la
+    notación de referencias silenciosa se pasa por alto el
+    comportamiento normal de Velocity. Para lograr eso en lugar de
+    <em>$correo</em> en el VTL usted utilizaría <em>$!correo</em>. Con
+    esta modificación el ejemplo anterior quedaría así:
+ </p>
+<div class="source"><pre>
+&lt;input type=&quot;text&quot; name=&quot;correo&quot; value=&quot;$!correo&quot;/&gt;
+</pre>
+</div>
+<p>
+    Ahora cuando el formulario se carga por primera vez y $correo no
+    tenga valor una cadena vacía se escribirá en lugar de &quot;$correo&quot;.
+ </p>
+<p>
+    La notación formal y la silenciosa se puede usar juntas como se
+    muestra en el ejemplo siguiente:
+ </p>
+<div class="source"><pre>
+&lt;input type=&quot;text&quot; name=&quot;correo&quot; value=&quot;$!{correo}&quot;/&gt;
+</pre>
+</div>
+</div>
+<div class="section"><h2><a name="Literalmente"></a>Literalmente</h2>
+<p>
+  VTL hace uso de caracteres especiales, como <em>$</em> y <em>#</em>,
+  para hacer su trabajo por lo que se debe tener algo de cuidado en el
+  momento de utilizar estos caracteres dentro de las plantillas. Esta
+  sección habla de como escapar el caracter <em>$</em>.
+  </p>
+<p><a name="Dinero"><strong>Dinero</strong></a><br />
+
+    No hay ningún problema en escribir &quot;Yo compré un saco de maíz de
+    2 kg. en el mercado de lagranja por sólo $2.50!&quot;. Como se mencionó
+    anteriormente, un identificador VTL siempre comienza con una letra
+    mayúscula o minúscula por lo que $2.50 no se confunde con una
+    referencia.
+  </p>
+<p><a name="EscapandoReferenciasVTLVálidas"><strong>Escapando Referencias
+          VTL Válidas</strong></a><br />
+
+  Pueden existir casos en donde haya la posibilidad de que Velocity se
+  confunda. <em>Escapar</em> caracteres especiales es la mejor manera de
+  manejar los caracteres partículares de VTL dentro de sus plantillas, y
+  esto se puede hacer utilizando el caracter palote o backslash (
+  <em>\</em> ).
+  </p>
+<div class="source"><pre>
+#set( $correo = &quot;foo&quot; )
+$correo
+</pre>
+</div>
+<p>
+    Si Velocity encuentra una referencia en su plantilla VTL a
+    <em>$correo</em>, el buscará el contexto ppor un valor
+    correspondiente. En este caso el resultado será <em>foo</em> por
+    qué <em>$correo</em> esta definido. Si <em>$correo</em> no esta
+    definido el resultado será <em>$correo</em>.
+  </p>
+<p>
+    Suponga que <em>$correo</em> está definido (por ejemplo, que tiene
+    el valor <em>foo</em>) y que usted desea escribir <em>$correo</em>.
+    Existen varias maneras de hacer esto pero la más sencilla es usar el
+    caracter de escape.
+  </p>
+<div class="source"><pre>
+## La siguiente línea define $correo en esta plantilla:
+#set( $correo = &quot;foo&quot; )
+$correo
+\$correo
+\\$correo
+\\\$correo
+</pre>
+</div>
+<p>
+     se muestra como
+  </p>
+<div class="source"><pre>
+foo
+$correo
+\foo
+\$correo
+</pre>
+</div>
+<p>
+  Note que el caracter <em>\</em> se asocia con <em>$</em> por la
+  izquierda. La regla de asociación por la izquierda hace que
+  <em>\\\$correo</em> se muestre como <em>\\$correo</em>. Compare estos
+  ejemplos con lo siguientes, en los que <em>$correo</em> no esta
+  definido.
+  </p>
+<div class="source"><pre>
+$correo
+\$correo
+\\$correo
+\\\$correo
+</pre>
+</div>
+<p>
+  se muestra como
+  </p>
+<div class="source"><pre>
+$correo
+\$correo
+\\$correo
+\\\$correo
+</pre>
+</div>
+<p>
+    Note que Velocity maneja de manera diferentes las referencias que
+    están definidas de aquellas que no lo están. A continuación se
+    encuentra una directiva que da a <em>$foo</em> el valor
+    <em>verde</em>.
+  </p>
+<div class="source"><pre>
+#set( $foo = &quot;verde&quot; )
+$luna = $foo
+</pre>
+</div>
+<p>
+La salida será: <em>$luna = verde</em> -- donde <em>$luna</em> se
+escribe literalmente porqué esta indefinido y <em>verde</em> se escribe
+en lugar de <em>$foo</em></p>
+<p>
+    También es posible escapar directivas de VTL; esto se describe con
+    más detalle en la sección de Directivas.
+  </p>
+</div>
+<div class="section"><h2><a name="Sustitución_de_Mayúsculas_y_Minúsculas"></a>Sustitución de Mayúsculas y Minúsculas</h2>
+<p>
+Ahora que usted esta familiarizado con las referencias, puede comenzar a
+aplicarlas de manera efectiva en sus plantillas. Las referencias de
+Velocity aprovechan algunos principios de Java que los diseñadores de
+plantillas encontraránm fáciles de utilizar. Por ejemplo:
+    </p>
+<div class="source"><pre>
+$foo
+
+$foo.getBar()
+## el lo mismo que
+$foo.Bar
+
+$data.setUser(&quot;jon&quot;)
+## es lo mismo que
+#set( $data.User = &quot;jon&quot; )
+
+$data.getRequest().getServerName()
+## es lo mismo que
+$data.Request.ServerName
+## que a su vez, es igual a
+${data.Request.ServerName}
+</pre>
+</div>
+<p>
+Estos ejemplos ilustran usos alternativos para la mismas referencias.
+Velocity se aprovechas de la instrospección y las capacidades de beans
+de Java para resolver los nombre de referencias tanto en el Contexto
+como en los métodos de los objetos. Es posible incluir y evaluar
+referencias casi en cualquier lugar de su plantilla.
+    </p>
+<p>
+    Velocity, que ha sido modelado con las especificaciones de Bean
+    definidas por Sun Microsystems, distingue entre mayúsculas y
+    minúsculas; sin embargo sus desarrolladores se han esforzado para
+    encontrar y corregir los errores del usuario cuando sea posible.
+    Cuando el método <em>getFoo()</em> es referenciado dentro de una
+    plantilla como <code>$bar.foo</code>, Velocity intentará primero
+    <code>getfoo()</code>. Si esto falla, intentará <code>getFoo()</code>.
+    De la misma manera, cuando una plantilla se refiera a
+    <code>$bar.Foo</code>, Velocity intentará <em>$getFoo()</em> primero
+    y luego <em>getfoo()</em>.
+    </p>
+<p>
+    Nota: <em>Las Referencias a variables de instancia dentro de una
+        plantilla no se resuelven.</em> Solo las referencias a los
+    atributos get y set de los JavaBeans se resuelven (i.e.
+    <code>$foo.Nombre</code> se resuelve como el método de instancia
+    <code>getNombre()</code> de la clase Foo, pero no como su variable
+    de instancia <code>Nombre</code>).
+    </p>
+</div>
+<div class="section"><h2><a name="Directivas"></a>Directivas</h2>
+<p>
+    Las Referencias le permiten a los diseñadores de plantillas generar
+    contenido dinámico para sitios web, mientras que las
+    <em>directivas</em> -- elementos de script fáciles de usar que se
+    pueden usar para manipular de manera creativa la salida del código
+    Java -- les permiten a los diseñadores realmente estar a cargo de la
+    apariencia y en contenido del sitio web.
+ </p>
+<a name="Set"><strong>#set</strong></a><p>
+ La directiva <em>#set</em> se utiliza para establecer el valor de una
+ referencia. El valor se puede asignar a una referencia de variable o
+ una referencia de propiedad, siempre entre paréntesis, como se muestra
+ a continuación:
+ </p>
+<div class="source"><pre>
+#set( $primate = &quot;mono&quot; )
+#set( $cliente.Comportamiento = $primate )
+</pre>
+</div>
+<p>
+    El lado izquierdo (LI) de la asignación debe ser una referencia de
+    variable o una referencia de propiedad. El lado derecho (LD) puede
+    ser de alguno de los siguientes tipos:
+ </p>
+<p><ul><li>Referencia de Variable</li>
+<li>Constante de Cadena</li>
+<li>Referencia de Propiedad</li>
+<li>Referencia de Método</li>
+<li>Literal Numérico</li>
+<li>Lista de elementos como arreglo</li>
+</ul>
+</p>
+<p>
+    These examples demonstrate each of the aforementioned types:
+ </p>
+<div class="source"><pre>
+#set( $mono = $pedro ) ## Referencia de Variable
+#set( $mono.Amigo = &quot;monica&quot; ) ## Constante de Cadena
+#set( $mono.Culpar = $casablanca.Fuga ) ## referencia de propiedad
+#set( $mono.Plan = $doctor.llamar($web) ) ## referencia de método
+#set( $mono.Numero = 123 ) ##Literal Numérico
+#set( $mono.Decir = [&quot;No&quot;, &quot;es&quot;, $mi, &quot;culpa&quot;] ) ##Arreglo
+</pre>
+</div>
+<p>
+ NOTA: En el último ejemplo los elementos definidos con el operador
+ [..] son accesibles usando los métodos definidos en la clase ArrayList.
+ Así, por ejemplo, usted podría acceder el primer elemento del arreglo utilizando $mono.Decir.get(0), con lo que obtendría la palabra &quot;No&quot;.
+ </p>
+<p>
+ El lado derecho también puede ser una expresión aritmética sencilla:
+ </p>
+<div class="source"><pre>
+#set( $value = $foo + 1 )
+#set( $value = $bar - 1 )
+#set( $value = $foo * $bar )
+#set( $value = $foo / $bar )
+</pre>
+</div>
+<p>
+    Si el Lado Derecho es una propiedad o referencia de método que se
+    evalúa como <em>null</em>, <b>no</b> será asignada al lado
+    izquierdo. No es posible remover una referencia existente del
+    contexto utilizando este mecanismo. Esto puede ser confuso para los
+    recién llegados a Velocity. Por ejemplo:
+ </p>
+<div class="source"><pre>
+#set( $resultado = $consulta.criterio(&quot;nombre&quot;) )
+El resultado de la primera consulta en $resultado
+
+#set( $resultado = $consulta.criterio(&quot;direccion&quot;) )
+El resultado de la segunda consulta es $resultado
+</pre>
+</div>
+<p>
+    Si <em>$consulta.criterio(&quot;nombre&quot;)</em> retorna la cadena &quot;pedro&quot;,
+    y <em>$consulta.criterio(&quot;direccion&quot;)</em> retorna <em>null</em>, el
+    VTL anterio se mostraría de la siguiente manera:
+ </p>
+<div class="source"><pre>
+El resultado de la primera consulta en pedro
+
+El resultado de la primera consulta en pedro
+</pre>
+</div>
+<p>
+    Esto tiende a confundir a quines están comenzando, que construyen
+    ciclos <em>#foreach</em> que intentan hacer <em>#set</em> de una
+    referencia por medio de una propiedad o un método e inmediatamente
+    evalúan la referencia con una directiva <em>#if</em>. Por ejemplo:
+ </p>
+<div class="source"><pre>
+
+#set( $criterios = [&quot;nombre&quot;, &quot;direccion&quot;] )
+
+#foreach( $criterio in $criterios )
+
+    #set( $resultado = $consulta.criterios($criterio) )
+
+    #if( $result )
+    La consulta tuvo éxito
+    #end
+
+#end
+</pre>
+</div>
+<p>
+    En el ejemplo anterior, no sería inteligente confiar en la
+    evaluación de <em>$resultado</em> para determinar si una consulta
+    tuvo éxito. Después de que <em>$result</em> ha sido agregado al
+    contexto (por medio de una directiva <em>#set</em>), no puede volver
+    a establecerse a <em>null</em> (quitarse del contexto). Los detalles
+    de las directivas <em>#if</em> y <em>#foreach</em> son cubiertos con
+    mayor detalle posteriormente en esta guía.
+ </p>
+<p>
+    Una solución para este problema puede ser predefinir
+    <em>$resultado</em> a <em>false</em>. Luego, si la llamada a
+    <em>$consulta.criterios()</em> falla, es posible verificar.
+ </p>
+<div class="source"><pre>
+
+#set( $criterios = [&quot;nombre&quot;, &quot;direccion&quot;] )
+
+#foreach( $criterio in $criterios )
+
+    #set( $resultado = false )
+    #set( $resultado = $consulta.criterios($criterio) )
+
+    #if( $resultado )
+        La consulta tuvo éxito
+    #end
+
+#end
+</pre>
+</div>
+<p>
+    A diferencia de algunas de las otras directivas de Velocity, la
+    directiva <em>#set</em> no tiene un enunciado <em>#end</em>.
+ </p>
+<a name="CadenasdeCaracteres"><strong>Cadenas de Caracteres</strong></a><p>
+    Cuando se utiliza la directiva <em>#set</em>, los literales de
+    cadena que están encerrados en comillas dobles serán evaluados y
+    mostrados en la plantilla, como se demuestra a continuación:
+ </p>
+<div class="source"><pre>
+#set( $directorioRaiz = &quot;www&quot; )
+#set( $nombrePlantilla = &quot;indice.vm&quot; )
+#set( $plantilla = &quot;$directorioRaiz/$nombrePlantilla&quot; )
+$plantilla
+</pre>
+</div>
+<p>
+ La salida será:
+ </p>
+<div class="source"><pre>
+www/indice.vm
+</pre>
+</div>
+<p>
+    Sin embargo, cuando la cadena de caracteres esta encerrada en
+    comillas sencillas, no será evaluada:
+ </p>
+<div class="source"><pre>
+#set( $foo = &quot;bar&quot; )
+$foo
+#set( $blarg = '$foo' )
+$blarg
+</pre>
+</div>
+<p>Se muestra como:</p>
+<div class="source"><pre>
+  bar
+  $foo
+</pre>
+</div>
+<p>
+    Por defecto, la característica de las comillas sencillas para
+    mostrar texto sin evaluar esta disponible en Velocity; sin embargo
+    este valor por defecto se puede cambiar editando el archivo
+    <code>velocity.properties</code> de tal manera que
+    <code>stringliterals.interpolate=false</code>.
+ </p>
+</div>
+<div class="section"><h2><a name="Sentencias_If-Else"></a>Sentencias If-Else</h2>
+<strong>Condicionales</strong><p>
+    La directiva <em>#if</em> en Velocity permite que se incluya texto
+    dentro de la plantilla generada, con la condición de que el
+    enunciado condicional evalue a verdadero. Por ejemplo:
+</p>
+<div class="source"><pre>
+#if( $foo )
+   &lt;strong&gt;Velocity!&lt;/strong&gt;
+#end
+</pre>
+</div>
+<p>
+    La variable <em>$foo</em> se evalúa para determinar si es verdadera,
+    cosa que ocurrirá bajo una de dos circunstancias: (i) <em>$foo</em>
+    es un valor booleano (verdadero ó falso) que tiene un valor de
+    verdadero, ó (ii) el valor no es <em>null</em>. Recuerde que el
+    contexto de Velocity solamente contiene objetos, por lo que cuando
+    se dice 'booleano' se habla en realidad de la clase Boolean. Esto es
+    cierto incluso para los métodos que devuelven un valor de tipo
+    <code>boolean</code> - la infraestructura de introspección devolverá
+    un <code>Boolean</code> del mismo valor lógico.
+</p>
+<p>
+    El contenido que se encuentra entre el enunciado <em>#if</em> y el
+    enunciado <em>#end</em> es lo que se escribe en la plantilla si la
+    evaluación resulta en un valor verdadero. En este caso, si
+    <em>$foo</em> es verdadero, la salida será: &quot;Velocity!&quot;. De manera
+    análoga, si <em>$foo</em> tiene un valor <em>null</em>, o evalua a
+    falso, entonces el enunciado completo es falso y no se escribe nada.
+</p>
+<p>
+    Un elemento <em>#elseif</em> ó <em>#else</em> puede utilizarse junto
+    con una sentencia <em>#if</em> para indicar condiciones adicionales
+    o la labor por defecto. Note que el Motor de Plantillas de Velocity
+    parará en la primera expresión que evalue a verdadero. En el ejemplo
+    siguiente suponga que <em>$foo</em> tiene un valor de 15 y
+    <em>$bar</em> tiene un valor de 6.
+</p>
+<div class="source"><pre>
+#if( $foo &lt; 10 )
+    &lt;strong&gt;Vaya hacía el Norte&lt;/strong&gt;
+#elseif( $foo == 10 )
+    &lt;strong&gt;Vaya hacía el Este&lt;/strong&gt;
+#elseif( $bar == 6 )
+    &lt;strong&gt;Vaya al Sur&lt;/strong&gt;
+#else
+    &lt;strong&gt;Vaya al Oeste&lt;/strong&gt;
+#end
+</pre>
+</div>
+<p>En este ejemplo, <em>$foo</em> es mayor que diez, por lo que las
+    dos primeras comparaciones fallan. A continuación se compara
+    <em>$bar</em> con 6, como son iguales, la salida es <strong>Vaya al
+        Sur</strong></p>
+<p><a name="OperadoresLógicosyRelacionales"><strong>Operadores
+            Lógicos y Relacionales</strong></a></p>
+<p>
+    Velocity usa el operador de equivalencia para determinar las
+    relaciones entre las variables. A continuación hay un ejemplo
+    sencillo para ilustrar como se utiliza el operador de igualdad.
+    </p>
+<div class="source"><pre>
+#set ($foo = &quot;ácido desoxiribonucleico&quot;)
+#set ($bar = &quot;ácido ribonucleico&quot;)
+
+#if ($foo == $bar)
+    En este caso es claro que no son equivalentes por lo que....
+  In this case it's clear they aren't equivalent. So...
+#else
+    No son equivalentes y esta será la salida.
+#end
+</pre>
+</div>
+<p>
+    Velocity tiene también operadores lógicos para el Y, el O y el NO
+    (AND, OR y NOT). Para mayor información vea la <a href="../vtl-reference-guide.html">Guía de Referencia VTL</a>.
+    A continuación se encuentran ejemplos que demuestran la utilización
+    de los operadores lógicos AND, OR y NOT.
+    </p>
+<div class="source"><pre>
+
+## Y lógico
+
+#if( $foo &amp;&amp; $bar )
+    &lt;strong&gt;Esto Y aquello&lt;/strong&gt;
+#end
+
+</pre>
+</div>
+<p>
+    La directiva <em>#if()</em> solamente evaluará a verdadero si tanto
+    <em>$foo</em> como <em>$bar</em> son ciertos. Si <em>$foo</em> es
+    falso la expresión evaluará a falso; <em>$bar</em> no será evaluada.
+    Si <em>$foo</em> es verdadero el Motor de Plantillas de Velocity
+    verificará el valor de <em>$bar</em>; si <em>$bar</em> es cierto,
+    entonces toda la expresión es cierto y la salida es <strong>Esto Y
+        aquello</strong>. Si <em>$bar</em> es falso, entonces no habrá
+    ninguna salida porque toda la expresión es falsa.
+    </p>
+<p>
+    El O lógico trabaja de la misma manera, pero sólo una de las
+    referencias debe evaluar a verdadero para que toda la expresión
+    evalue a verdadero. Considere el ejemplo siguiente.
+    </p>
+<div class="source"><pre>
+
+## O lógico
+
+#if( $foo || $bar )
+    &lt;strong&gt;Esto O Aquello&lt;/strong&gt;
+#end
+</pre>
+</div>
+<p>
+    Si <em>$foo</em> es verdadero, el Motor de Plantillas de Velocity no
+    necesita consultar <em>$bar,</em>; sin importar si <em>$bar</em> es
+    cierto o falso, la expresión será cierta, y <strong>Esto O
+        Aquello</strong> será la salida. Si <em>$foo</em> es falso, en
+    cambio, es necesario verificar <em>$bar</em>. En este caso, si
+    <em>$bar</em> es falso, entonces la expresión es falsa y no se
+    escribe nada. De otro lado, si <em>$bar</em> es verdadero, entonces
+    toda la expresión es verdadera y el resultado es <strong>Esto O
+        Aquello</strong></p>
+<p>
+    Con el operador lógico NO, solo hay un argumento :
+    </p>
+<div class="source"><pre>
+
+## NO lógico
+
+#if( !$foo )
+&lt;strong&gt;eso NO&lt;/strong&gt;
+#end
+
+</pre>
+</div>
+<p>
+    Aquí si <em>$foo</em> es cierto, entonces <em>!$foo</em> es falso, y
+    no se escribe nada. Por el contrario, si <em>$foo</em> es falso,
+    entonces <em>!$foo</em> será verdadero y <strong>eso NO</strong>
+    será escrito. Tenga cuidado de no confundir este operador con la
+    <em>referencia sileciosa $!foo</em>, que es algo completamente
+    distinto.
+    </p>
+</div>
+<div class="section"><h2><a name="Ciclos_Foreach"></a>Ciclos Foreach</h2>
+<strong>Ciclo Foreach</strong><p>
+    El elemento <em>#foreach</em> permite la construcción de ciclos. Por
+    ejemplo:
+    </p>
+<div class="source"><pre>
+&lt;ul&gt;
+#foreach( $producto in $todosProductos )
+    &lt;li&gt;$producto&lt;/li&gt;
+#end
+&lt;/ul&gt;
+</pre>
+</div>
+<p>
+    Este cilco <em>#foreach</em> hace que el objeto correspondiente a la
+    lista de $todosProductos sea iterado buscando todos los productos de
+    la lista. En cada iteración del ciclo, el valor de
+    <em>$todosProductos</em> se asigna a la variable <em>$producto</em>.
+    </p>
+<p>
+    El contenido de la variable <em>$todosProductos</em> es un Vector,
+    una tabla de Hashing (Hashtable) o un arreglo (Array). El valor
+    asignado a la variable <em>$producto</em> es un objeto Java y se
+    puede referenciar desde una variabkle como tal. Por ejemplo, si
+    <em>$product</em> fuera realmente un elemento de la clase Producto
+    en Java, su nombre se podría obtener referenciando el método
+    <em>$producto.Nombre</em> (ie: <em>$Product.getName()</em>).
+    </p>
+<p>
+    Ahora supongamos que <em>$todosProductos</em> es una tabla de
+    Hashing. Si usted quisiera recuperar los valores de las llaves de la
+    tabla de Hashing, al igual que los objetos dentro de esta, usted
+    podría utilizar código como el siguiente:
+    </p>
+<div class="source"><pre>
+&lt;ul&gt;
+    #foreach( $llave in $todosProductos.keySet() )
+    &lt;li&gt;Llave: $llave -&gt; Valor: $todosProductos.get($llave)&lt;/li&gt;
+#end
+&lt;/ul&gt;
+</pre>
+</div>
+<p>
+    Velocity proporciona una manera sencilla de obtener el contador del
+    ciclo para que usted pueda hacer algo como lo siguiente:
+</p>
+<div class="source"><pre>
+&lt;table&gt;
+    #foreach( $cliente in $listaClientes )
+    &lt;tr&gt;&lt;td&gt;$foreach.count&lt;/td&gt;&lt;td&gt;$cliente.Nombre&lt;/td&gt;&lt;/tr&gt;
+#end
+&lt;/table&gt;
+</pre>
+</div>
+</div>
+<div class="section"><h2><a name="Include"></a>Include</h2>
+<p>
+    El elemento de script <em>#include</em> le permite al diseñador de
+    plantillas importar un archivo local, que después es insertado en la
+    localización donde se encuentra la sentencia <em>#include</em>. Los
+    contenidos del archivo no se muestran por intermedio del motor de
+    plantillas por lo que si se hacen referencias dentro del archivo,
+    estas no serán reemplazadas. Por motivos de seguridad el archivo que
+    va a ser incluido debe encontrarse en el directorio indicado por la
+    propiedad TEMPLATE_ROOT.
+    </p>
+<div class="source"><pre>
+#include( &quot;uno.txt&quot; )
+</pre>
+</div>
+<p>
+    El archivo al que se refiere la directiva <em>#include</em> se
+    encierra entre comillas. Si mas de un archivo será incluido, los
+    nombres de los archivos a incluir deben ir separados por comas.
+    </p>
+<div class="source"><pre>
+#include( &quot;uno.gif&quot;,&quot;dos.txt&quot;,&quot;tres.htm&quot; )
+</pre>
+</div>
+<p>
+    El archivo a incluir no tiene que ser referenciado por nombre, de
+    hecho, muchas veces es preferible usar una variable, en lugar de un
+    nombre de archivo. Esto puede ser útil para dirigir la salida de
+    acuerdo a criterios determinados cuando la solicitud de la página es
+    enviada, es decir, que dependa de factores como los datos del
+    usuario que visita la página, el momento del día, etc. A
+    continuación se muestra un ejemplo en el que se usan tanto un nombre
+    como una variable.
+    </p>
+<div class="source"><pre>
+#include( &quot;greetings.txt&quot;, $seasonalstock )
+</pre>
+</div>
+</div>
+<div class="section"><h2><a name="Parse"></a>Parse</h2>
+<p>
+    El elemento de script <em>#parse</em> le permite al diseñadore de
+    plantillas importar un archivo local que contiene VTL. Velocity
+    procesará el VTL y mostrará la plantilla especificada.
+</p>
+<div class="source"><pre>
+#parse( &quot;yo.vm&quot; )
+</pre>
+</div>
+<p>
+    Al igual que la directiva <em>#include</em>, <em>#parse</em> puede
+    utilizar una variable, en lugar de una plantilla. Todas las
+    plantillas a las que <em>#parse</em> se refiera deben incluirse bajo
+    TEMPLATE_ROOT. A diferencia de la directva <em>#include</em>,
+    <em>#parse</em> solo recibe un argumento.
+</p>
+<p>
+    Las plantillas de VTL puede tener sentencias <em>#parse</em> que se
+    refieran a plantillas que a su vez tengan sentencias
+    <em>#parse</em>. La línea <em>parse_directive.maxdepth</em> del
+    archivo <code>velocity.properties</code>, cuyo valor por defecto es
+    10, permite a los usuarios configurar el máximo número de
+    referencias a <em>#parse</em> que pueden ocurrir desde una única
+    plantilla. (Nota: Si la propiedad <em>parse_directive.maxdepth</em>
+    no esta dentro del archivo <code>velocity.properties</code>,
+    Velocity establecerá el valor por defecto en 10.) La recursión esta
+    permitida, por ejemplo, si la plantilla <code>hacerfoo.vm</code>
+    contiene las siguientes líneas:
+    </p>
+<div class="source"><pre>
+Cuenta Regresiva.
+#set( $cuenta = 8 )
+#parse( &quot;parsefoo.vm&quot; )
+Listo hacerfoo.vm!
+</pre>
+</div>
+<p>
+    Hay una referencia a la plantilla <code>parsefoo.vm</code>, que
+    contiene el siguiente código VTL:
+</p>
+<div class="source"><pre>
+$cuenta
+#set( $cuenta = $cuenta - 1 )
+#if( $cuenta &gt; 0 )
+    #parse( &quot;parsefoo.vm&quot; )
+#else
+    Listo parsefoo.vm!
+#end
+</pre>
+</div>
+<p>
+    Después de que se muestra &quot;Cuenta Regresiva.&quot;, Velocity pasa por
+    <code>parsefoo.vm</code>, contando hacía abajo desde 8. Cuando el
+    conteo llegue a 0, mostrará el mensaje &quot;Listo parsefoo.vm!&quot;. En este
+    punto Velocity volverá a <code>dofoo.vm</code> y escribirá el
+    mensaje &quot;Listo hacerfoo.vm!&quot;.
+    </p>
+</div>
+<div class="section"><h2><a name="Stop"></a>Stop</h2>
+<p>
+El elemento de script <em>#stop</em> permite al diseñador parar la
+ejecución del motor de plantillas y volver. Esto es útil para propósitos
+de corrección de errores.
+</p>
+<div class="source"><pre>
+#stop
+</pre>
+</div>
+</div>
+<div class="section"><h2><a name="Velocimacros"></a>Velocimacros</h2>
+<p>
+    El elemento de script <em>#macro</em> script permite definir un
+    segmento de plantilla VTL repetitivo. Los Velocimacros son muy
+    útiles en una amplia gama se situaciones, tanto simples como
+    complejas. El siguiente Velocimacro, creado con el único propósito
+    de ahorrar tecleo y minimizar errores tipográficos, provee una
+    introducción al concepto de Velocimacros
+    element allows template designers to.
+    </p>
+<div class="source"><pre>
+#macro( d )
+&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
+#end
+</pre>
+</div>
+<p>
+    El Velocimacro que se define en este ejemplo es <em>d</em>, y se
+    puede llamar de manera similar a cualquier otra directiva VTL:
+    </p>
+<div class="source"><pre>
+#d()
+</pre>
+</div>
+<p>
+Cuando esta plantilla sea solicitada, Velocity reemplazará <em>#d()</em>
+por una fila conteniendo un única celda vacia.
+</p>
+<p>
+Un Velocimacro puiede tomar cualquier número de argumentos -- no tener
+ningún argumento, como se mostró en el primer ejemplo, es una opción --
+pero cuando sea invocado el Velocimacro debe ser llamado con el mismo
+número de argumentos con el que fue definido. Muchos Velocimacros se
+relacionan con el entorno mucho más con su entorno que el ejemplo
+demostrado anteriormente. Aquí hay un Velocimacro que recibe dos
+argumentos, un color y un arreglo.
+</p>
+<div class="source"><pre>
+#macro( filastabla $color $algunalista )
+#foreach( $algo in $algunalista )
+    &lt;tr&gt;&lt;td bgcolor=$color&gt;$algo&lt;/td&gt;&lt;/tr&gt;
+#end
+#end
+</pre>
+</div>
+<p>
+El Velocimacro que se define en este ejemplo, <em>filastabla</em>, toma
+dos argumentos. El primer argumento toma el lugar de <em>$color</em>, y
+el segundo argumento el de <em>$algunalista</em></p>
+<p>
+Cualquier cosa que se pueda incluir dentro de una plantilla VTL puede
+formar parte delcuerpo de un Velocimacro. El Velocimacro
+<em>filastabla</em> es una sentencia <em>foreach</em>. Hay dos
+sentencias <em>#end</em> dentro del Velocimacro; la primera pertenece al
+<em>foreach</em> y a segunda termina la definición del Velocimacro.
+    </p>
+<div class="source"><pre>
+#set( $grandeslagos = [&quot;Superior&quot;,&quot;Michigan&quot;,&quot;Huron&quot;,&quot;Erie&quot;,&quot;Ontario&quot;] )
+#set( $color = &quot;blue&quot; )
+&lt;table&gt;
+    #filastabla( $color $grandeslagos )
+&lt;/table&gt;
+</pre>
+</div>
+<p>
+    Note que <em>$grandeslagos</em> toma el lugar de
+    <em>$algunalista</em>. Cuando el Velocimacro es llamado en esta
+    situación, la siguiente salida es generada:
+    </p>
+<div class="source"><pre>
+&lt;table&gt;
+    &lt;tr&gt;&lt;td bgcolor=&quot;blue&quot;&gt;Superior&lt;/td&gt;&lt;/tr&gt;
+    &lt;tr&gt;&lt;td bgcolor=&quot;blue&quot;&gt;Michigan&lt;/td&gt;&lt;/tr&gt;
+    &lt;tr&gt;&lt;td bgcolor=&quot;blue&quot;&gt;Huron&lt;/td&gt;&lt;/tr&gt;
+    &lt;tr&gt;&lt;td bgcolor=&quot;blue&quot;&gt;Erie&lt;/td&gt;&lt;/tr&gt;
+    &lt;tr&gt;&lt;td bgcolor=&quot;blue&quot;&gt;Ontario&lt;/td&gt;&lt;/tr&gt;
+&lt;/table&gt;
+</pre>
+</div>
+<p>
+Los Velocimacro pueden ser definidos <em>inline</em> dentro de una
+plantilla. Esto quiere decir que la definición del macro no esta
+disponible para otras plantillas dentro del mimso sitio Web. Definir un
+Velocimacro de tal forma que sea compartido por todas las plantillas
+tiene ventajas obvias: Reduce la necesidad de redefinir el macro en
+varias plantillas, ahorrando trabajo y disminuyendo las posiblidades de
+error, además de asegurar que un único cambio en un archivo quedará
+disponible para todas las plantillas.
+</p>
+<p>
+Si el Velocimacro <em>#filastabla($color $lista)</em> fuera definido en
+una librería, se podría utilizar en cualquiera de la plantillas
+normales; se podría utilizar muchas veces con propósitos distintos. En
+la plantilla <code>vegetal.vm</code> dedicado a todas las plantas, el
+Velocimacro <em>#filastabla</em> podría invocarse para listar las partes
+de un vegetal típico:
+    </p>
+<div class="source"><pre>
+#set( $partes = [&quot;raíz&quot;,&quot;tallo&quot;,&quot;hojas&quot;,&quot;flores&quot;,&quot;frutos&quot;] )
+#set( $colorCelda = &quot;#CC00FF&quot; )
+&lt;table&gt;
+    #filastabla( $colorCelda $parts )
+&lt;/table&gt;
+</pre>
+</div>
+<p>
+Cuando atendiera ls solicitud de <code>vegetal.vm</code>, Velocity
+encontraría el macro <em>#filastabla</em> en la librería de plantillas
+(definida en el archivo <code>velocity.properties</code>) y generaría el
+siguiente resultado:
+    </p>
+<div class="source"><pre>
+&lt;table&gt;
+    &lt;tr&gt;&lt;td bgcolor=&quot;#CC00FF&quot;&gt;raíz&lt;/td&gt;&lt;/tr&gt;
+    &lt;tr&gt;&lt;td bgcolor=&quot;#CC00FF&quot;&gt;tallo&lt;/td&gt;&lt;/tr&gt;
+    &lt;tr&gt;&lt;td bgcolor=&quot;#CC00FF&quot;&gt;hojas&lt;/td&gt;&lt;/tr&gt;
+    &lt;tr&gt;&lt;td bgcolor=&quot;#CC00FF&quot;&gt;flores&lt;/td&gt;&lt;/tr&gt;
+    &lt;tr&gt;&lt;td bgcolor=&quot;#CC00FF&quot;&gt;frutos&lt;/td&gt;&lt;/tr&gt;
+&lt;/table&gt;
+</pre>
+</div>
+<strong>Argumentos de un Velocimacro</strong><p>
+Los Velocimacros pueden recibir como argumentos cualquiera de los
+siguientes elementos de VTL:
+  </p>
+<ul><li>
+    Referencia : cualquier cosa que comience con '$'
+    </li>
+<li>
+    Cadena de caracteres : algo como &quot;$foo&quot; u 'hola'
+    </li>
+<li>
+      Número : 1, 2 etc
+    </li>
+<li>
+        Rango de enteros : [ 1..2] ó [$foo .. $bar]
+    </li>
+<li>
+        ObjectArray : [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;]
+    </li>
+<li>
+       El valor booleano &quot;verdadero&quot;
+    </li>
+<li>
+       El valor booleano &quot;falso&quot;
+    </li>
+</ul>
+<p>
+    Cuando pase referencias como argumentos para los Velocimacros tenga
+    en cuenta que las referencias se pasan 'por nombre'. Esto quiere
+    decir que su valor es 'generado' cada vez que se usa dentro del
+    Velocimacros. Esta característica le permite pasar referencias con
+    las llamadas de método y hacer que el método se llame cada vez. Por
+    ejemplo, cuando llame el siguiente Velocimacro
+   </p>
+<div class="source"><pre>
+   #macro( llamame $a )
+         $a $a $a
+     #end
+
+#llamame( $foo.bar() )
+   </pre>
+</div>
+<p>
+    Esa llamada hace que el método bar() de la referencia $foo sea
+    llamado 3 veces.
+    </p>
+<p>
+    A primera vista, esta característica parece sorprendente, pero
+    cuando se tiene en cuenta la motivación original de los Velocimacros
+    -- eliminar la duplicación de &quot;copiar y pegar&quot; del VTL usado varias
+    veces -- tiene mucho sentido. Permite pasar al Velocimacro objetos
+    con estado, como un objeto que genera colores en una secuencia
+    repetitiva para colorear las filas de una tabla.
+    </p>
+<p>
+    Si usted no desea utilizar esta característica siempre es posible
+    simplemente obtener el valor del método como una nueva referencia y
+    pasar ese valor:
+    </p>
+<div class="source"><pre>
+    #set( $mivalor = $foo.bar() )
+    #llamame( $mivalor )
+   </pre>
+</div>
+<strong>Propiedades de un Velocimacro</strong><p>
+   Varias líneas en al archivo <code>velocity.properties</code> permiten
+   flexibilizar la implementación de los Velocimacro. Tenga en cuenta
+   que estas propiedades también están documentadas en la <a href="../developer-guide.html">Guía de Desarrolladores</a>.
+   </p>
+<p><code>velocimacro.library</code> - Una lista, separada por comas de
+   todas la librerias de plantillas de Velocimacros. Por defecto,
+   Velocity busca una sola librería: <em>VM_global_library.vm</em>. El
+   directorio en el que se buscan las plantillas también se utiliza para
+   localizar las librerías.
+    </p>
+<p><code>velocimacro.permissions.allow.inline</code> - Esta propiedad,
+    que tiene como valores posibles verdadero y falso (true y false),
+    determina si los Velocimacros pueden ser definidos dentro de las
+    plantillas normales.
+    El valor por defecto, verdadero, le permite a los diseñadores
+    definir por si mismos macros en las plantillas.
+    </p>
+<p><code>velocimacro.permissions.allow.inline.to.replace.global</code> -
+    Con valores posibles verdadero y falso (true y false), esta
+    propiedad le permite al usuario decidir si un Velocimacro definido
+    inline dentro de una plantilla puede reemplazar a la plantilla
+    global, que fue cargada al comienzo por medio de la propiedad
+    <code>velocimacro.library</code>. El valor por defecto, falso
+    (<code>false</code>), evita que los Velocimacros definidos en una
+    plantilla reemplacen a los que fueron cargados al inicio.
+    </p>
+<p><code>velocimacro.permissions.allow.inline.local.scope</code> -
+    Con valores posibles verdadero y falso (true y false), valor por
+    defecto falso, esta propiedad dice si los Velocimacros definidos
+    inline son 'visibles' únicamente para la plantilla que los define.
+    Usted puede usar esta característica para hacer algunos trucos de
+    VM - si un VM global llama a otro VM global, con ancance inline, una
+    plantilla puede definir una implementación privada del segundo VM,
+    que será llamada por el primer VM cuando sea invocado en esa
+    plantilla. Ninguna de las otras templates es afectada.
+    </p>
+<p><code>velocimacro.library.autoreload</code> - Esta propiedad
+    controla el cargado automático de la libreria de Velocimacros. El
+    valor por defecto es <code>false</code>. Cuando es verdadero
+    (<code>true</code>) la librería fuente de un Velocimacro que ha sido
+    invocado será verificada para comprobar que no haya cambiado, y si
+    lo ha hecho será recargada. Esta característica le permite cambiar y
+    probar librerías de macros sin necesidad de reiniciar la aplicación
+    o el contenedor de servlets, de la misma manera que se hace con
+    plantillas normales.
+    Este modo solo funciona cuando el caché esta <i>apagado</i>
+    en los cargadores de recursos( e.g. <code>file.resource.loader.cache
+        = false</code>).
+    Esta característica esta pensada para el proceso de desarrollo, no
+    el de producción.
+    This property
+    </p>
+<strong>Cosas y Casos de Velocimacros</strong><p>
+    Actualmente los Velocimacros deben ser definidos antes de ser
+    utilizados por primera vez dentro de una plantilla. Esto significa
+    que sus declaraciones de #macro() deben aparecerantes de que usted
+    utilice los Velocimacros.
+    </p>
+<p>
+    Esto es importante recordarlo cuando usted intenta hacerle #parse()
+    a una plantilla que contiene directivas #macro(). Como el #parse()
+    ocurre en tiempo de ejecución, y el parser decide si un elemento que
+    parece una VM es realmente un VM cuando esta haciendo el #parse(),
+    entonces probablemente el #parse() de un conjunto de declaraciones
+    no funciona como se esperaría. Para evitar este problema,
+    simplemente utilice la propiedad
+    <code>velocimacro.library</code>para cargar todos sus VM cuando se
+    inicie la aplicación.
+    </p>
+</div>
+<div class="section"><h2><a name="Escapando_Directivas_VTL"></a>Escapando Directivas VTL</h2>
+<p>
+Las directivas de VTL se pueden escapar con el palote invertido o
+backslash (&quot;\&quot;) de manera similar a como se escapan las referencias de
+VTL válidas.
+</p>
+<div class="source"><pre>
+## #include( &quot;a.txt&quot; ) se muestra como &lt;contenidos of de a.txt&gt;
+#include( &quot;a.txt&quot; )
+
+## \#include( &quot;a.txt&quot; ) se muestra como #include( &quot;a.txt&quot; )
+\#include( &quot;a.txt&quot; )
+
+## \\#include ( &quot;a.txt&quot; ) se muestra como \&lt;contenidos de a.txt&gt;
+\\#include ( &quot;a.txt&quot; )
+</pre>
+</div>
+<p>
+Se debe tener especial cuidado cuando se escapan directivas de VTL que
+contienen varios elementos de script en una misma directiva (como en las
+sentencias if-else-end). A continuación seencuentra un ejemplo de un
+condicional típico de VTL:
+  </p>
+<div class="source"><pre>
+#if( $jazz )
+    Vyacheslav Ganelin
+#end
+</pre>
+</div>
+<p>
+  Si <em>$jazz</em> es cierto la salida es
+  </p>
+<div class="source"><pre>
+Vyacheslav Ganelin
+</pre>
+</div>
+<p>
+  Si <em>$jazz</em> es fals, no hay salida. Escapar elementos de script
+  altera la salida. Considere el siguiente caso:
+  </p>
+<div class="source"><pre>
+\#if( $jazz )
+    Vyacheslav Ganelin
+\#end
+</pre>
+</div>
+<p>
+Sin importar si <em>$jazz</em> es verdadero o falso, la salida será:
+</p>
+<div class="source"><pre>
+ #if($ jazz )
+     Vyacheslav Ganelin
+ #end
+ </pre>
+</div>
+<p>
+ De hecho, como todos los elementos de script están escapados,
+ <em>$jazz</em> nunca se evalúa por su valor booleano.
+ Suponga que los palotes invertidos preceden a elementos de script que
+ están legitimamente escapados:
+  </p>
+<div class="source"><pre>
+\\#if( $jazz )
+   Vyacheslav Ganelin
+\\#end
+</pre>
+</div>
+<p>
+En este caso, si <em>$jazz</em> es verdadero, la salida es
+</p>
+<div class="source"><pre>
+\ Vyacheslav Ganelin
+\
+</pre>
+</div>
+<p>
+Para entender esto tenga en cuenta que <code>#if( arg )</code>, cuando
+es terminado por un caracter de fin de línea (retorno) omitirá ese
+caracter de la salida. Por lo tanto, el cuerpo del bloque
+<code>#if()</code> va a continuación del primer '\', que se generó a
+partir del '\\' que precedía el <code>#if()</code> dentro de la
+pantilla. El último \ está en una línea distinta que el texto porqué hay
+un retorno después de 'Ganelin', por lo que el \\ final, que precede el
+<code>#end</code> hace parte del cuerpo del bloque.
+  </p>
+<p>
+  Si <em>$jazz</em> es falso, la salida es
+  </p>
+<div class="source"><pre>
+\
+</pre>
+</div>
+<p>
+  Tenga en cuenta que las
+  cosas dejan de funcionar si los elementos de script no son escapados
+  de manera correcta.
+  </p>
+<div class="source"><pre>
+\\\#if( $jazz )
+    Vyacheslave Ganelin
+\\#end
+</pre>
+</div>
+<p>
+  Aquí el <em>#if</em> esta escapado, pero hay un <em>#end</em> que
+  sobra; al haber demasiados cierres (end) sin sus correspondientes
+  aperturas (foreach ó if) se generará un error de procesamiento.
+  </p>
+</div>
+<div class="section"><h2><a name="VTL:_Asuntos_de_Formato"></a>VTL: Asuntos de Formato</h2>
+<p>
+A pesar de que el VTL mostrado en esta guía del usuario se muestra en la
+mayoría de los casos con cambios de línea y espacios en blanco, el VTL
+que se muestra a continuación
+    </p>
+<div class="source"><pre>
+#set( $imperial = [&quot;Munetaka&quot;,&quot;Koreyasu&quot;,&quot;Hisakira&quot;,&quot;Morikune&quot;] )
+#foreach( $shogun in $imperial )
+    $shogun
+#end
+</pre>
+</div>
+<p>
+es tan válido como el siguiente trozo de código que Geir Magnusson Jr.
+publicó a la lista de correo de usuarios de Velocity para ilustrar un
+punto sin ninguna relación:
+</p>
+<div class="source"><pre>
+Enviame #set($foo = [&quot;$10 y &quot;,&quot;un pastel&quot;])#foreach($a in $foo)$a #end
+por favor.
+</pre>
+</div>
+<p>
+El comportamiento de Velocity es el de ingnorar el espacio vacío de
+exceso. La directiva descrita anteriormente puede reescribirse como:
+</p>
+<div class="source"><pre>
+Enviame
+#set( $foo = [&quot;$10 y &quot;,&quot;un pastel&quot;] )
+#foreach( $a in $foo )
+$a
+#end
+por favor.
+</pre>
+</div>
+<p>
+    o como
+    </p>
+<div class="source"><pre>
+Enviame
+#set($foo       = [&quot;$10 y &quot;,&quot;un pastel&quot;])
+                 #foreach           ($a in $foo )$a
+    #end por favor.
+</pre>
+</div>
+<p>
+En cada caso la salida será la misma
+    </p>
+</div>
+<div class="section"><h2><a name="Otras_Características_y_Miscelánea"></a>Otras Características y Miscelánea</h2>
+<div class="section"><h3><a name="Matemáticas"></a>Matemáticas</h3>
+<p>
+Velocity tiene varias funciones matemáticas incluidas que pueden ser
+utilizadas en plantillas con la directiva <em>set</em>. Las siguientes
+ecuaciones son ejemplos de suma, resta, multiplicación y división
+respectivamente:
+</p>
+<div class="source"><pre>
+#set( $foo = $bar + 3 )
+#set( $foo = $bar - 4 )
+#set( $foo = $bar * 6 )
+#set( $foo = $bar / 2 )
+</pre>
+</div>
+<p>
+  Cuando una operación de división se realiza
+  entre dos operandos enteros, el resultado será un
+  valor entero, correspondiente al valor truncado de la
+  división. El valor del resto puede obtenerse
+  utilizando el operador módulo (<em>%</em>).
+</p>
+<div class="source"><pre>
+#set( $foo = $bar % 5 )
+</pre>
+</div>
+</div>
+<div class="section"><h3><a name="El_Operador_de_Rango"></a>El Operador de Rango</h3>
+<p>
+El operador de rango se puede usar en conjunción con las directivas
+<em>#set</em> y <em>#foreach</em>. Es muy útil por su capacidad para
+crear arreglos de objetos compuestos por enteros. La construcción del
+operador rango es como sigue:
+</p>
+<div class="source"><pre>
+[n..m]
+</pre>
+</div>
+<p>
+Tanto <em>n</em> como <em>m</em> debe ser o producir enteros. El hecho
+de que <em>m</em> sea mayor o menor que <em>n</em> no importa; en ese
+caso el rango cimplemente contará hacía abajo. A continuación se
+muestran varios ejemplos de uso del operador rango:
+</p>
+<div class="source"><pre>
+Primer ejemplo:
+#foreach( $foo in [1..5] )
+$foo
+#end
+
+Segundo ejemplo:
+#foreach( $bar in [2..-2] )
+$bar
+#end
+
+Tercer ejemplo:
+#set( $arr = [0..1] )
+#foreach( $i in $arr )
+$i
+#end
+
+Cuarto ejemplo:
+[1..3]
+</pre>
+</div>
+<p>
+  Produce lo siguiente:
+  </p>
+<div class="source"><pre>
+Primer ejemplo:
+1 2 3 4 5
+
+Segundo ejemplo:
+2 1 0 -1 -2
+
+Tercer ejemplo:
+0 1
+
+Cuarto ejemplo:
+[1..3]
+</pre>
+</div>
+<p>
+enga en cuenta que el operador de rango solamente produce un arreglo
+cuando se utiliza junto con las directivas <em>#set</em> y
+<em>#foreach</em>, como se demuestra en el cuarto ejemplo.
+</p>
+<p>
+Los diseñadores de páginas preocupados con hacer los tamaños de las
+tablas iguales, pero con información que puede no se suficiente para
+llenar la tabla, encontrarán el operador de rango particularmente útil.
+</p>
+</div>
+<div class="section"><h3><a name="Temas_Avanzados:_Escapando_y_"></a>Temas Avanzados: Escapando y !</h3>
+<p>
+Cuando una referencia se hace silenciona con el caracter <em>!</em> y el
+caracter <em>!</em> viene precedido por un caracter de escape
+<em>\</em> la referencia se maneja de una manera diferente. Observe las
+diferencias entre el escape sencillo y el caso especial en el que
+<em>\</em> precede a <em>!</em>:
+</p>
+<div class="source"><pre>
+#set( $foo = &quot;bar&quot; )
+$\!foo
+$\!{foo}
+$\\!foo
+$\\\!foo
+</pre>
+</div>
+<p>
+   Se muestra como:
+  </p>
+<div class="source"><pre>
+$!foo
+$!{foo}
+$\!foo
+$\\!foo
+</pre>
+</div>
+<p>
+   A diferencia del escape normal, donde <em>\</em> precede a <em>$</em>:
+  </p>
+<div class="source"><pre>
+\$foo
+\$!foo
+\$!{foo}
+\\$!{foo}
+</pre>
+</div>
+<p>
+  Se muestra como:
+  </p>
+<div class="source"><pre>
+$foo
+$!foo
+$!{foo}
+\bar
+</pre>
+</div>
+</div>
+<div class="section"><h3><a name="Miscelánea_de_Velocimacro"></a>Miscelánea de Velocimacro</h3>
+<p>
+Esta sección contiene un conjunto de preguntas frecuentes (FAQ)
+relacionadas con Velocimacros. Esta sección cambiará con el tiempo, por
+lo que es bueno revisar si hay información nueva de cuando en cuando.
+</p>
+<p>
+Nota : A través de esta sección 'Velocimacro' será abreviado como 'VM'.
+</p>
+<strong>¿Puedo usar una directiva u otro VM como argumento para un VM?</strong><p>
+Ejemplo : <code>#center( #bold(&quot;hola&quot;) )</code></p>
+<p>
+No.  Una directiva no es un argumento válido para una directiva y, para
+la mayoría de los propósitos prácticos, un VM es una directiva.
+</p>
+<p><i>Sin embargo...</i>, hay cosas que usted puede hacer. Una solución
+sencilla es aprovechar el hecho de que la doble comilla (&quot;) muestra sus
+contenidos, por lo que usted puede hacer algo como
+</p>
+<div class="source"><pre>
+#set($cosas = &quot;#bold('hola')&quot; )
+#center( $cosas )
+</pre>
+</div>
+<p>
+Puede tener un paso...
+</p>
+<div class="source"><pre>
+#center( &quot;#bold( 'hola' )&quot; )
+</pre>
+</div>
+<p>
+Tenga en cuenta que en segundo ejemplo el argumentos es evaluado <i>
+    dentro</i> de la VM, no a nivel del llamador. En otras palabras, el
+argumento para el VM es pasado completo y evaluado dentro del VM al que
+se le pasa. Esto le permite hacer cosas como :
+</p>
+<div class="source"><pre>
+
+#macro( interno $foo )
+  interno : $foo
+#end
+
+#macro( externo $foo )
+   #set($bar = &quot;externolala&quot;)
+   externo : $foo
+#end
+
+#set($bar = 'calltimelala')
+#externo( &quot;#interno($bar)&quot; )
+
+</pre>
+</div>
+<p>
+Donde la salida es
+</p>
+<div class="source"><pre>
+externo : interno : externolala
+</pre>
+</div>
+<p>
+la evaluación de &quot;#interno($bar)&quot; se lleva a cabo dentro de #externo(),
+por lo que el valor $bar establecido dentro de #externo() es el que se
+utiliza.
+</p>
+<p>
+Estas es una característica intencional y celosamente protegina - los
+argumentos se pasan por nombre a los VM para que usted le pueda
+'entregar' a los VMs referencias con estado como
+</p>
+<div class="source"><pre>
+#macro( foo $color )
+  &lt;tr bgcolor=$color&gt;&lt;td&gt;Hola&lt;/td&gt;&lt;/tr&gt;
+  &lt;tr bgcolor=$color&gt;&lt;td&gt;Todos&lt;/td&gt;&lt;/tr&gt;
+#end
+
+#foo( $bar.colorFila() )
+</pre>
+</div>
+<p>
+Y lograr que colorFila() se llame varias veces, en lugar de solo una.
+Par evitar que eso ocurra invoque el método fuera del VM y pásele el
+valor al VM.
+</p>
+<div class="source"><pre>
+#set($color = $bar.colorFila())
+#foo( $color )
+</pre>
+</div>
+<strong>¿Puedo registrar Velocimacros por medio de #parse() ? </strong><p>
+Actualmente, los Velocimacros deben ser definidos antes de ser usados
+por primera vez dentro de una plantilla. Esto significa que sus
+declaraciones de #macro() deben venir antes de que usted use los
+Velocimacros.
+</p>
+<p>
+    Esto es importante recordarlo cuando usted intenta hacerle #parse()
+    a una plantilla que contiene directivas #macro(). Como el #parse()
+    ocurre en tiempo de ejecución, y el parser decide si un elemento que
+    parece una VM es realmente un VM cuando esta haciendo el #parse(),
+    entonces probablemente el #parse() de un conjunto de declaraciones
+    no funciona como se esperaría. Para evitar este problema,
+    simplemente utilice la propiedad
+    <code>velocimacro.library</code>para cargar todos sus VM cuando se
+    inicie la aplicación.
+    </p>
+<strong>¿Qué es la auto recarga de Velocimacros?</strong><p>
+    Existe una propiedad, pensada para usarse en <i>desarrollo</i>, no
+    en producción :
+  </p>
+<p><code>velocimacro.library.autoreload</code></p>
+<p>
+  que tiene como valor por defecto falso. Cuando se hace verdadera
+  <em>junto con</em><code>&lt;tipo&gt;.resource.loader.cache = false</code>
+  (where &lt;tipo&gt; es el nombre del cargador de recursos que usted
+  esta utilizando, como 'file' para archivos) entonces el motor de
+  Velocity recargará automáticamente los cambios en su librerías en el
+  momento en que los haga para que usted no tenga que reinicar el motor
+  de servlets o la aplicación, o hacer otros trucos para lograr que sus
+  Velocimacros se recarguen.
+    </p>
+<p>
+    A continuación se muestra un conjunto sencillo de propiedades de
+    configuración.
+    </p>
+<div class="source"><pre>
+    file.resource.loader.path = templates
+    file.resource.loader.cache = false
+    velocimacro.library.autoreload = true
+    </pre>
+</div>
+<p>No utilice esto en producción</p>
+</div>
+<div class="section"><h3><a name="Concatenación_de_Cadenas"></a>Concatenación de Cadenas</h3>
+<p>
+Una pregunta común que los desarrolladores formulan es <i>¿Cómo
+    concateno cadenas de caracteres? ¿Existe algún análogo al operador
+    '+' en Java?</i></p>
+<p>
+   Para concatenar referencias en VTL usted solo tiene que 'ponerlos
+   juntos'. El contenido del contexto  en donde usted desee juntar las
+   referencias es importante, por lo que ilustraremos con algunos
+   ejemplos.
+   </p>
+<p>
+   En el código regular de una plantilla (cuando usted lo mezcla con
+   contenido normal)
+   </p>
+<div class="source"><pre>
+   #set( $tam = &quot;Big&quot; )
+   #set( $nombre = &quot;Ben&quot; )
+
+   El reloj es $tam$nombre.
+   </pre>
+</div>
+<p>
+    y la salida será 'El reloj es BigBen'. Para caso más interesantes,
+    como cuando ested desea concatenar las cadenas que pasará a un
+    método, o establecer el valor de una nueva referencia use
+   </p>
+<div class="source"><pre>
+      #set( $tam = &quot;Big&quot; )
+      #set( $nombre = &quot;Ben&quot; )
+
+      #set($reloj = &quot;$tam$nombre&quot; )
+
+        El reloj es $reloj.
+    </pre>
+</div>
+<p>
+    Que resultará en la mismo que el ejemplo anterior. Como un ejemplo
+    final, cuando usted desea mezclar cadenas 'estáticas' con sus
+    referencias usted puede necesitar 'referencias formales':
+    </p>
+<div class="source"><pre>
+      #set( $tam = &quot;Big&quot; )
+      #set( $nombre = &quot;Ben&quot; )
+
+      #set($reloj = &quot;${tam}Alto$nombre&quot; )
+
+      El reloj es $reloj.
+    </pre>
+</div>
+<p>
+    Ahora el resultado es 'El reloj es BigAltoBen'. La notación formal
+    es necesaria para que el procesador de las plantillas sepa que usted
+    quiso usar la referencia '$tam', en lugar de '$tamAlto', que sería
+    lo que entendería si los corchetes '{}' no estuvieran presentes.
+    </p>
+</div>
+</div>
+<div class="section"><h2><a name="Retroalimentación"></a>Retroalimentación</h2>
+<p>
+Si encuentra algún error en este manual o tiene algún otro comentario o
+retroalimentación relacionada con la guía del usuario de Velocity, por
+favor envie un correo a <a href="mailto:user@velocity.apache.org" class="externalLink">La lista de usuarios
+    de Velocity</a>.
+Gracias!
+  </p>
+</div>
+
+      </div>
+    </div>
+    <div class="clear">
+      <hr/>
+    </div>
+    <div id="footer">
+      <div class="xright">&#169;  
+          2000-2010
+    
+          The Apache Software Foundation
+          
+  
+
+  
+    
+  
+  
+    
+             Last Published: 2010-11-29 23:49:23
+            </div>
+      <div class="clear">
+        <hr/>
+      </div>
+    </div>
+  </body>
+</html>



Mime
View raw message