<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>TeraBIThia</title><link>http://geeks.ms/blogs/crisfervil/default.aspx</link><description>Blog sobre el mundo de la informática y la tecnología. Principalmente sobre la plataforma Microsoft y su .net Framework</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>[#Oferta Trabajo] Experience Design Manager</title><link>http://geeks.ms/blogs/crisfervil/archive/2012/07/17/oferta-trabajo-experience-design-manager.aspx</link><pubDate>Tue, 17 Jul 2012 13:05:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206136</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=206136</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2012/07/17/oferta-trabajo-experience-design-manager.aspx#comments</comments><description>&lt;p&gt;Os paso una oferta de trabajo de mi empresa, por si alguno pudiera estar interesado.&lt;/p&gt;  &lt;p&gt;La oferta es para Avanade España: &lt;a href="http://www.avanade.com"&gt;http://www.avanade.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Si te preguntas qué tal es Avanade como destino, te comento que ha sido seleccionada por tercer año consecutivo entre las mejores empresas de Europa para trabajar.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.topemployers.eu/TopEmployersEurope2012/C/tabid/5864/C/1394/Avanade.aspx" href="http://www.topemployers.eu/TopEmployersEurope2012/C/tabid/5864/C/1394/Avanade.aspx"&gt;http://www.topemployers.eu/TopEmployersEurope2012/C/tabid/5864/C/1394/Avanade.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.avanade.com" target="_blank"&gt;&lt;img alt="es-es" src="http://www.avanade.com/publishingimages/logo.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.topemployers.eu/TopEmployersEurope2012/C/tabid/5864/C/1394/Avanade.aspx" target="_blank"&gt;&lt;img src="http://portal.unitbv.ro/proxy/images.ashx?dec=1&amp;amp;url=uh4QwdELmTxTxOVQvTbBvrbIvTBBwDlKtroLogZOxgfIwOYU1cZo4pZfppZ4oRZonRbzoR4bnA4boA4z3ANp4pYNl8VMvCw=B6X%21" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Van los datos de la oferta.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Buscamos una persona de más de 6 años de experiencia en la creación de interfaces, web sites y aplicaciones de gran escala &lt;/p&gt;  &lt;p&gt;· Imprescindible, tener experiencia demostrada en las siguientes tecnologías: HTML5, CSS3, Javascript, jQuery, XAML Expresion Blend, Photoshop, Illustrator, Expression Design&lt;/p&gt;  &lt;p&gt;· Así como una sólida trayectoria en actividades relativas a UX gestionando equipos de personas&lt;/p&gt;  &lt;p&gt;· Habilidades en gestión de clientes &lt;/p&gt;  &lt;p&gt;· Tener experiencia y conocimiento en la aplicación de las metodologías de diseño de interacción y de investigación para el desarrollo de software, web y móvil &lt;/p&gt;  &lt;p&gt;· Facilidad de integración y participación con el equipo&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Si estás interesado, envíame un correo a &lt;/p&gt;  &lt;p&gt;&lt;img alt="Your gMail image" src="http://portal.unitbv.ro/proxy/images.ashx?dec=1&amp;amp;url=uh4QwdELmSjLsr0QvSNLtTAKsSZJmT4LvSNPmSxJsqBImSBJsqxBmDbEwdZKsqRB2q0Our0CtrjSuqMCuqR7tSoZl3==B6X%21" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206136" width="1" height="1"&gt;</description></item><item><title>XSL for Dynamics CRM Plug-in Documentation</title><link>http://geeks.ms/blogs/crisfervil/archive/2012/07/10/xsl-for-dynamics-crm-plug-in-documentation.aspx</link><pubDate>Tue, 10 Jul 2012 13:31:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206034</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=206034</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2012/07/10/xsl-for-dynamics-crm-plug-in-documentation.aspx#comments</comments><description>&lt;p&gt;&lt;img height="238" width="212" src="https://encrypted-tbn3.google.com/images?q=tbn:ANd9GcTSmEobcKKDGxTYlIJupXLsqybNqGO37wk2VKZJkm54NlcJ5uC4yQ" alt="" /&gt;&lt;img height="104" width="483" src="https://encrypted-tbn3.google.com/images?q=tbn:ANd9GcRLlDLRUvZxF6j7QNgWrvt1idcT9ObdlpgJ45fotG9hM4JidltreQ" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Apunto por aqu&amp;iacute; este XSL que me ha venido bien para generar la documentaci&amp;oacute;n del c&amp;oacute;digo de unos plug-in para Dynamics CRM.&lt;/p&gt;
&lt;p&gt;Como ya sabr&amp;eacute;is, cuando Visual Studio compila un proyecto, adem&amp;aacute;s ofrece la opci&amp;oacute;n de generar un fichero XML con todos los comentarios de las cabeceras de los m&amp;eacute;todos.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_3AEF6E00.png"&gt;&lt;img height="254" width="391" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_7E813C19.png" alt="image" border="0" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Imagen: Opci&amp;oacute;n que hay que activar en VS2008 para que se genere el XML de documentaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_187A1D9E.png"&gt;&lt;img height="167" width="419" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_09D2026A.png" alt="image" border="0" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5D4DF3E5.png"&gt;&lt;img height="196" width="564" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1042A5AF.png" alt="image" border="0" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Imagen: XML de documentaci&amp;oacute;n generada por Visual Studio.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Este fichero puede ser tratado con herramientas como &lt;a target="_blank" href="http://sandcastle.codeplex.com/"&gt;Sandcastle&lt;/a&gt; que nos permite generar a partir de este XML la documentaci&amp;oacute;n del proyecto usando el formato de la &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/ms123401.aspx"&gt;MSDN&lt;/a&gt;, u otro personalizado.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_42CB2483.png"&gt;&lt;img height="214" width="580" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_43C835C2.png" alt="image" border="0" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Imagen: Ejemplo de documentaci&amp;oacute;n generada con Sandcastle.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Estas herramientas est&amp;aacute;n muy bien, pero&amp;hellip; (siempre hay un pero) este formato puede no ser el que necesitemos. O las opciones que nos ofrezca la herramienta pueden no satisfacer nuestras necesidades.&lt;/p&gt;
&lt;p&gt;Entonces lo que podemos hacer, en lugar de abrir el Word y empezar a escribir literatura, es crear un peque&amp;ntilde;o fichero XSL, que se encargue de filtrar los m&amp;eacute;todos que necesitamos y que genere la documentaci&amp;oacute;n en el formato preciso, a partir del XML que ya genera Visual Studio.&lt;/p&gt;
&lt;p&gt;Adem&amp;aacute;s, de esta forma, podemos a&amp;ntilde;adir algunos atributos adicionales, que en el caso de los plug-ins de CRM pueden venir muy bien, ahora veremos porqu&amp;eacute;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6332189B.png"&gt;&lt;img height="587" width="725" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_210DEE71.png" alt="image" border="0" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Imagen: Elementos a&amp;ntilde;adidos a la documentaci&amp;oacute;n que posteriormente reconocer&amp;aacute; el XSL.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En este proyecto en concreto, necesitaba documentar s&amp;oacute;lo algunos m&amp;eacute;todos, adem&amp;aacute;s de indicar un identificador asociado a cada m&amp;eacute;todo, el requerimiento asociado, y la informaci&amp;oacute;n de registro del plugin. Todo esto cumpliendo un formato espec&amp;iacute;fico, que no era el de la MSDN.&lt;/p&gt;
&lt;p&gt;Toda esta informaci&amp;oacute;n deb&amp;iacute;a ir posteriormente en un Word de millones de p&amp;aacute;ginas, que impreso quedar&amp;iacute;a fenomenal para coger polvo en la estanter&amp;iacute;a.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7657A502.png"&gt;&lt;img height="560" width="698" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1C772210.png" alt="image" border="0" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Imagen: Fichero HTML generado por el XSL.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Una de las cosas que hemos ganado utilizando este enfoque ha sido dejar la documentaci&amp;oacute;n en el lugar en el que mejor est&amp;aacute;: junto al c&amp;oacute;digo. Hemos pasado de documentar en Word a documentar directamente en la cabecera de cada m&amp;eacute;todo. Si para ver la descripci&amp;oacute;n de un par&amp;aacute;metro debo abrir un Word tan grande que tarda 2 minutos en cargarse, lo m&amp;aacute;s probable es que prefiera depurarlo para ver qu&amp;eacute; hace.&lt;/p&gt;
&lt;p&gt;Para indicar qu&amp;eacute; clases se documentan, y qu&amp;eacute; clases no, se usa el elemento &amp;lt;pluginhandler&amp;gt;. S&amp;oacute;lo aquellas clases que lo lleven aparecer&amp;aacute;n en la documentaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Para los m&amp;eacute;todos, ocurre algo parecido. S&amp;oacute;lo los m&amp;eacute;todos que lleven el elemento &amp;lt;plugin&amp;gt; ser&amp;aacute;n documentados.&lt;/p&gt;
&lt;p&gt;Pego finalmente el c&amp;oacute;digo XSL que genera el HTML de la imagen anterior.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;xmlns:xsl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="attr"&gt;xmlns:msxsl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:schemas-microsoft-com:xslt&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;exclude-result-prefixes&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;msxsl&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="attr"&gt;xmlns:mf&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:my-scripts&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:output&lt;/span&gt; &lt;span class="attr"&gt;method&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;html&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;indent&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;yes&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt; &lt;span class="attr"&gt;match&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;      body{&lt;/pre&gt;
&lt;pre class="alt"&gt;      font-size:&amp;quot;9pt&amp;quot;;&lt;/pre&gt;
&lt;pre&gt;      font-family:&amp;quot;Arial&amp;quot;;&lt;/pre&gt;
&lt;pre class="alt"&gt;      }&lt;/pre&gt;
&lt;pre&gt;      .Table&lt;/pre&gt;
&lt;pre class="alt"&gt;      {&lt;/pre&gt;
&lt;pre&gt;      border:solid black 1px;&lt;/pre&gt;
&lt;pre class="alt"&gt;      }&lt;/pre&gt;
&lt;pre&gt;      .TableTR&lt;/pre&gt;
&lt;pre class="alt"&gt;      {&lt;/pre&gt;
&lt;pre&gt;      border:none;&lt;/pre&gt;
&lt;pre class="alt"&gt;      }&lt;/pre&gt;
&lt;pre&gt;      .TableTD&lt;/pre&gt;
&lt;pre class="alt"&gt;      {&lt;/pre&gt;
&lt;pre&gt;      border-right:solid black 1px;&lt;/pre&gt;
&lt;pre class="alt"&gt;      border-bottom:solid black 1px;&lt;/pre&gt;
&lt;pre&gt;      padding:5px;&lt;/pre&gt;
&lt;pre class="alt"&gt;      }&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/doc/members/member/pluginhandler&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:variable&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;typeName&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;substring-after(../@name,&amp;#39;T:&amp;#39;)&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;      &lt;span class="rem"&gt;&amp;lt;!-- parent node name attr--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h4&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@entity&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; Plugins&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h4&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt; &lt;span class="attr"&gt;border&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;cellspacing&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;cellpadding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;700px&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Table&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;col&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;100px&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;col&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;100px&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;col&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;200px&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;col&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;300px&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTR&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;background:#CCCCCC;&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Requirements&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Plugin Id&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Registration Info&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Description&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/doc/members/member[starts-with(@name,concat(&amp;#39;M:&amp;#39;,$typeName))]&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:if&lt;/span&gt; &lt;span class="attr"&gt;test&lt;/span&gt;=&amp;quot;&lt;span class="attr"&gt;count&lt;/span&gt;(&lt;span class="attr"&gt;plugin&lt;/span&gt;)&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;0&amp;quot;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTR&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:call-template&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TextOrHyphen&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:with-param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;pText&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;requiremementid&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:call-template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:call-template&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TextOrHyphen&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:with-param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;pText&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;pluginid&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:call-template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="rem"&gt;&amp;lt;!--Registration Info --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;font-size:x-small;&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text-decoration:underline&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;plugin/@type&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; Plug-in&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Events:&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;event&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;- &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@name&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; (&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@type&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Images:&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:choose&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:when&lt;/span&gt; &lt;span class="attr"&gt;test&lt;/span&gt;=&amp;quot;&lt;span class="attr"&gt;count&lt;/span&gt;(&lt;span class="attr"&gt;image&lt;/span&gt;)&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;0&amp;quot;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;image&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text-decoration:underline&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@name&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@fields&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:when&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:otherwise&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;None required&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:otherwise&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:choose&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;&amp;lt;!-- End Registration Info --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:copy-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;summary&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="rem"&gt;&amp;lt;!-- Parameters --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:if&lt;/span&gt; &lt;span class="attr"&gt;test&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;count(param)&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;colspan&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;4&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;background:#E0E0EB&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Parameters&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;colspan&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;4&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="rem"&gt;&amp;lt;!-- Parameters --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt; &lt;span class="attr"&gt;border&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;cellspacing&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;cellpadding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;700px&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Table&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;col&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;200px&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;col&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;150px&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;col&lt;/span&gt; &lt;span class="attr"&gt;width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;350px&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTR&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;background:#CCCCCC&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Name&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;  &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Type&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;  &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Description&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:choose&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:when&lt;/span&gt; &lt;span class="attr"&gt;test&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;count(param)=0&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTR&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;-&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;-&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;-&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:when&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:otherwise&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;param&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTR&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:call-template&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TextOrHyphen&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:with-param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;pText&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@name&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:call-template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:choose&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:when&lt;/span&gt; &lt;span class="attr"&gt;test&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;not(string(@type)=&amp;#39;&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@type&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:when&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:otherwise&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;mf:GetParameterType(../@name, position())&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:otherwise&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:choose&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:copy-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:otherwise&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:choose&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="rem"&gt;&amp;lt;!-- End Parameters --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:if&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="rem"&gt;&amp;lt;!-- End Parameters --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="rem"&gt;&amp;lt;!-- Exceptions and Summary --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:if&lt;/span&gt; &lt;span class="attr"&gt;test&lt;/span&gt;=&amp;quot;&lt;span class="attr"&gt;count&lt;/span&gt;(&lt;span class="attr"&gt;exception&lt;/span&gt;)&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;0 or count(remarks)&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;0&amp;quot;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;              &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TableTD&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;colspan&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;4&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;background:#E0E0EB&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Remarks&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:copy-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;remarks&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:if&lt;/span&gt; &lt;span class="attr"&gt;test&lt;/span&gt;=&amp;quot;&lt;span class="attr"&gt;count&lt;/span&gt;(&lt;span class="attr"&gt;exception&lt;/span&gt;)&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;0&amp;quot;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Exceptions&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;b&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;exception&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;u&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;@cref&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;u&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:copy-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;                  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:if&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;              &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:if&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;&amp;lt;!-- End Exceptions and Summary --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:if&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TextOrHyphen&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;pText&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:choose&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:when&lt;/span&gt; &lt;span class="attr"&gt;test&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;string($pText)=&amp;#39;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;-&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:when&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:otherwise&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$pText&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:otherwise&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:choose&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;msxsl:script&lt;/span&gt; &lt;span class="attr"&gt;language&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;implements-prefix&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;mf&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;[CDATA[ &lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;/pre&gt;
&lt;pre&gt;    public string SubstringAfterLast(string text, string delimiter)&lt;/pre&gt;
&lt;pre class="alt"&gt;    {&lt;/pre&gt;
&lt;pre&gt;      string retVal = &amp;quot;&amp;quot;;&lt;/pre&gt;
&lt;pre class="alt"&gt;      &lt;/pre&gt;
&lt;pre&gt;      if(!string.IsNullOrEmpty(text)&amp;amp;&amp;amp;text.Contains(delimiter))&lt;/pre&gt;
&lt;pre class="alt"&gt;      {&lt;/pre&gt;
&lt;pre&gt;          retVal = text.Substring(text.LastIndexOf(delimiter)+1);&lt;/pre&gt;
&lt;pre class="alt"&gt;      }&lt;/pre&gt;
&lt;pre&gt;      return retVal;&lt;/pre&gt;
&lt;pre class="alt"&gt;    }&lt;/pre&gt;
&lt;pre&gt;    &lt;/pre&gt;
&lt;pre class="alt"&gt;    // Splits a method signature and returns the value type of&lt;/pre&gt;
&lt;pre&gt;    // the parameter in the specified position&lt;/pre&gt;
&lt;pre class="alt"&gt;    public string GetParameterType(string parametersString,int index)&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;      string retVal = &amp;quot;&amp;quot;;&lt;/pre&gt;
&lt;pre&gt;      if(!string.IsNullOrEmpty(parametersString)&amp;amp;&amp;amp;parametersString.Contains(&amp;quot;(&amp;quot;)){&lt;/pre&gt;
&lt;pre class="alt"&gt;        parametersString=parametersString.Substring(parametersString.IndexOf(&amp;#39;(&amp;#39;)+1);&lt;/pre&gt;
&lt;pre&gt;        parametersString=parametersString.Substring(0,parametersString.Length-1);&lt;/pre&gt;
&lt;pre class="alt"&gt;        string[] parameters = parametersString.Split(&amp;#39;,&amp;#39;);&lt;/pre&gt;
&lt;pre&gt;        if(index&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;=parameters.Length)&lt;/pre&gt;
&lt;pre class="alt"&gt;        {&lt;/pre&gt;
&lt;pre&gt;          retVal = parameters[index-1];&lt;/pre&gt;
&lt;pre class="alt"&gt;          if(!string.IsNullOrEmpty(retVal))&lt;/pre&gt;
&lt;pre&gt;          {&lt;/pre&gt;
&lt;pre class="alt"&gt;            if(retVal.Contains(&amp;quot;.&amp;quot;))&lt;/pre&gt;
&lt;pre&gt;            {&lt;/pre&gt;
&lt;pre class="alt"&gt;              retVal = retVal.Substring(retVal.LastIndexOf(&amp;#39;.&amp;#39;)+1);&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;            retVal = retVal.Replace(&amp;quot;}&amp;quot;,&amp;quot;?&amp;quot;);&lt;/pre&gt;
&lt;pre&gt;          }&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;pre&gt;      }&lt;/pre&gt;
&lt;pre class="alt"&gt;      return retVal;&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;    ]]&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;msxsl:script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Son 280 l&amp;iacute;neas, que aunque parezcan muchas, no se tarda demasiado en escribir. El XSL es un lenguaje muy&amp;hellip; verboso (cu&amp;aacute;l es la traducci&amp;oacute;n de verbose?)&lt;/p&gt;
&lt;p&gt;Quiz&amp;aacute; lo m&amp;aacute;s complicado ha sido obtener el tipo de datos de cada par&amp;aacute;metro. Para esto est&amp;aacute; la funci&amp;oacute;n GetParameterType, que aunque est&amp;aacute; definida dentro del XSL es una funci&amp;oacute;n c#. Esta es una funcionalidad XSL no est&amp;aacute;ndar. S&amp;oacute;lo est&amp;aacute; disponible con el parser MSXML.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Para ejecutar el XSL se puede usar la opci&amp;oacute;n de men&amp;uacute; que aparece cuando abrimos el XSL con visual Studio.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7B1C9DD5.png"&gt;&lt;img height="170" width="519" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2EE724D8.png" alt="image" border="0" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;La primera vez, Visual Studio nos preguntar&amp;aacute; qu&amp;eacute; XML de entrada queremos usar. Habr&amp;aacute; que indicarle el XML de documentaci&amp;oacute;n que se encuentra en la carpeta bin del output de Visual Studio.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n puede hacerse desde la l&amp;iacute;nea de comandos. Inicialmente, pensaba que con la utilidad msxsl.exe&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=21714" title="http://www.microsoft.com/en-us/download/details.aspx?id=21714"&gt;http://www.microsoft.com/en-us/download/details.aspx?id=21714&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6B350B24.png"&gt;&lt;img height="342" width="673" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_0694A02C.png" alt="image" border="0" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pero resulta que no, que esta utilidad no admite usar funciones en l&amp;iacute;nea, como la que usamos para averiguar los tipos de los par&amp;aacute;metros.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Por lo que necesitamos hacernos una aplicaci&amp;oacute;n de consola. Pero, es sencillito sencillito.&lt;/p&gt;
&lt;p&gt;La clase que utilizamos para realizar la magia es XslCompiledTransform.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/42d26t30.aspx" title="http://msdn.microsoft.com/en-us/library/42d26t30.aspx"&gt;http://msdn.microsoft.com/en-us/library/42d26t30.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Aplicaci&amp;oacute;n de consola para ejecutar la transformaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.XPath;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.Xsl;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; XslTransform&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;
&lt;pre&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (args.Length != 3)&lt;/pre&gt;
&lt;pre&gt;            {&lt;/pre&gt;
&lt;pre class="alt"&gt;                Console.WriteLine(&lt;span class="str"&gt;&amp;quot;You have not entered the correct parameters&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; xmlfile = args[0];&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; xslfile = args[1];&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; outfile = args[2];&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            {&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;using&lt;/span&gt; (XmlReader reader = XmlReader.Create(xmlfile))&lt;/pre&gt;
&lt;pre&gt;                {&lt;/pre&gt;
&lt;pre class="alt"&gt;                    XmlWriterSettings wSettings = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlWriterSettings();&lt;/pre&gt;
&lt;pre&gt;                    wSettings.ConformanceLevel = ConformanceLevel.Auto;&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;using&lt;/span&gt; (XmlWriter writer = XmlWriter.Create(outfile,wSettings))&lt;/pre&gt;
&lt;pre&gt;                    {&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="rem"&gt;// Create and load the transform with script execution enabled.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        XslCompiledTransform transform = &lt;span class="kwrd"&gt;new&lt;/span&gt; XslCompiledTransform();&lt;/pre&gt;
&lt;pre class="alt"&gt;                        XsltSettings settings = &lt;span class="kwrd"&gt;new&lt;/span&gt; XsltSettings();&lt;/pre&gt;
&lt;pre&gt;                        settings.EnableScript = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        transform.Load(xslfile, settings, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="rem"&gt;// Execute the transformation.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                        transform.Transform(reader, writer);&lt;/pre&gt;
&lt;pre class="alt"&gt;                        writer.Close();&lt;/pre&gt;
&lt;pre&gt;                    }&lt;/pre&gt;
&lt;pre class="alt"&gt;                }&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e)&lt;/pre&gt;
&lt;pre&gt;            {&lt;/pre&gt;
&lt;pre class="alt"&gt;                Console.WriteLine(e.ToString());&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;Primer par&amp;aacute;metro: Path del fichero Xml con la documentaci&amp;oacute;n generado por Visual Studio&lt;/p&gt;
&lt;p&gt;Segundo par&amp;aacute;metro: Path del fichero Xsl que hemos construido.&lt;/p&gt;
&lt;p&gt;Tercer par&amp;aacute;metro: Path de salida. Ser&amp;iacute;a el Xml con la documentaci&amp;oacute;n HTML Generada.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Y la llamada desde la l&amp;iacute;nea de comandos ser&amp;iacute;a as&amp;iacute;:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;XslTransform.exe MyBusiness.Plugnis.xml PluginsDoc.xslt PluginsDoc.html&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.20.60.34/Attachments.zip"&gt;El c&amp;oacute;digo se puede descargar desde aqu&amp;iacute;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.w3schools.com/xsl/" title="http://www.w3schools.com/xsl/"&gt;http://www.w3schools.com/xsl/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.w3schools.com/xpath/" title="http://www.w3schools.com/xpath/"&gt;http://www.w3schools.com/xpath/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms256471.aspx" title="http://msdn.microsoft.com/en-us/library/ms256471.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms256471.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206034" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.20.60.34/Attachments.zip" length="2768" type="application/zip" /><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/CRM/default.aspx">CRM</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Xml/default.aspx">Xml</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Dynamics/default.aspx">Dynamics</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Xsl/default.aspx">Xsl</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/XPath/default.aspx">XPath</category></item><item><title>Dynamics CRM Plugin Deployment Batch</title><link>http://geeks.ms/blogs/crisfervil/archive/2012/06/29/dynamics-crm-plugin-deployment-batch.aspx</link><pubDate>Fri, 29 Jun 2012 13:17:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205841</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=205841</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2012/06/29/dynamics-crm-plugin-deployment-batch.aspx#comments</comments><description>&lt;p&gt;&lt;img height="132" width="382" src="http://t0.gstatic.com/images?q=tbn:ANd9GcToJF2owz39tCUwOsRrtZDmM8xFfPa9T699y9UHGtvaEjy5QcyNw23vzvBy" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;La tarea de depurar plugins en CRM es una de las tareas m&amp;aacute;s engorrosas con las que me ha tocado bregar.&lt;/p&gt;
&lt;p&gt;Cada vez que tocas el c&amp;oacute;digo de un plugin, hay que &lt;/p&gt;
&lt;p&gt;recompilar, &lt;/p&gt;
&lt;p&gt;parar el web de CRM, &lt;/p&gt;
&lt;p&gt;parar el Asynchronous Processing Service, &lt;/p&gt;
&lt;p&gt;copiar las dlls a la carpeta del servidor, &lt;/p&gt;
&lt;p&gt;registrar en la GAC las dependencias, &lt;/p&gt;
&lt;p&gt;iniciar el web y el servicio,&lt;/p&gt;
&lt;p&gt;volver a probar.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Un engorro, vamos. Por eso, he creado este peque&amp;ntilde;o batch que hace todo eso en un click.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;set PLUGINS_OUTPUT=C:\Projects\Plugins\bin\Debug\&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;set CRM_SERVER_NAME=CRMSERVERNAME&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;set GACUTIL_PATH=C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;set SERVER_ASSEMBLY_LOCAL_PATH=C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembly\&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;set SERVER_ASSEMBLY_NETWORK_PATH=\\CRMSERVERNAME\C$\Program Files\Microsoft Dynamics CRM\Server\bin\assembly\&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;REM STOP CRM WEB And Service&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;sc \\%CRM_SERVER_NAME% stop MSCRMAsyncService&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;sc \\%CRM_SERVER_NAME% stop w3svc&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;REM Copy Files&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;copy &lt;span class="str"&gt;&amp;quot;%PLUGINS_OUTPUT%Plugins.dll&amp;quot;&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;%SERVER_ASSEMBLY_NETWORK_PATH%&amp;quot;&lt;/span&gt; /y&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;copy &lt;span class="str"&gt;&amp;quot;%PLUGINS_OUTPUT%Plugins.pdb&amp;quot;&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;%SERVER_ASSEMBLY_NETWORK_PATH%&amp;quot;&lt;/span&gt; /y&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;copy &lt;span class="str"&gt;&amp;quot;%PLUGINS_OUTPUT%PluginsDependencies1.dll&amp;quot;&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;%SERVER_ASSEMBLY_NETWORK_PATH%&amp;quot;&lt;/span&gt; /y&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;copy &lt;span class="str"&gt;&amp;quot;%PLUGINS_OUTPUT%PluginsDependencies2.dll&amp;quot;&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;%SERVER_ASSEMBLY_NETWORK_PATH%&amp;quot;&lt;/span&gt; /y&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;REM Register files &lt;span class="kwrd"&gt;in&lt;/span&gt; GAC&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;psexec.exe \\%CRM_SERVER_NAME% -c &lt;span class="str"&gt;&amp;quot;%GACUTIL_PATH%&amp;quot;&lt;/span&gt; /&lt;span class="kwrd"&gt;if&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;%SERVER_ASSEMBLY_LOCAL_PATH%PluginsDependencies1.dll&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;psexec.exe \\%CRM_SERVER_NAME% -c &lt;span class="str"&gt;&amp;quot;%GACUTIL_PATH%&amp;quot;&lt;/span&gt; /&lt;span class="kwrd"&gt;if&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;%SERVER_ASSEMBLY_LOCAL_PATH%PluginsDependencies2.dll&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;REM Delete GAC registered files&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;del &lt;span class="str"&gt;&amp;quot;%SERVER_ASSEMBLY_NETWORK_PATH%PluginsDependencies1.dll&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;del &lt;span class="str"&gt;&amp;quot;%SERVER_ASSEMBLY_NETWORK_PATH%PluginsDependencies2.dll&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;REM START CRM WEB and Service&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;sc \\%CRM_SERVER_NAME% start MSCRMAsyncService&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;sc \\%CRM_SERVER_NAME% start w3svc&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Variables de la cabecera:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PLUGINS_OUTPUT&lt;/strong&gt;: Output de Visual Studio con las dll del plugin y sus dependencias.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CRM_SERVER_NAME&lt;/strong&gt;: El nombre de red del servidor de CRM&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GACUTIL_PATH&lt;/strong&gt;: Ruta local de la utilidad &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/ex0ss12c.aspx"&gt;GACUTIL&lt;/a&gt;. S&amp;oacute;lo existe en el servidor si est&amp;aacute; instalado el SDK de .net, por tanto lo cogemos del equipo local.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SERVER_ASSEMBLY_LOCAL_PATH&lt;/strong&gt;: Ruta Local del directorio bin de CRM del servidor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SERVER_ASSEMBLY_NETWORK_PATH&lt;/strong&gt;: La misma ruta, pero accesible desde la red. Al ser administradores deber&amp;iacute;amos poder acceder al ra&amp;iacute;z usando C$.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;La utilidad &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/ex0ss12c.aspx"&gt;GACUTIL.exe&lt;/a&gt; permite registrar ensamblados en la cach&amp;eacute; de .net.&lt;/p&gt;
&lt;p&gt;Es necesario tener permisos de administrador en el servidor de CRM.&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n es necesario tener la utilidad &lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx"&gt;psexec.exe&lt;/a&gt; de &lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb545021.aspx"&gt;Windows Sys Internals&lt;/a&gt;. Esta utilidad permite ejecutar comandos en un servidor remoto. Como si fuera un telnet, pero m&amp;aacute;s potente. &lt;/p&gt;
&lt;p&gt;El comando &lt;a target="_blank" href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sc.mspx?mfr=true"&gt;SC.exe&lt;/a&gt; permite controlar servicios del servidor de forma remota.&lt;/p&gt;
&lt;p&gt;Lo he probado contra un servidor de CRM 4. No s&amp;eacute; qu&amp;eacute; tal ir&amp;aacute; contra un CRM 2011.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Referencias&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx"&gt;http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx&lt;/a&gt; &lt;br /&gt;&lt;a target="_blank" href="http://blogs.iis.net/davcox/archive/2009/07/14/where-is-gacutil-exe.aspx"&gt;http://blogs.iis.net/davcox/archive/2009/07/14/where-is-gacutil-exe.aspx&lt;/a&gt; &lt;br /&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/ex0ss12c%28v=vs.80%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/ex0ss12c%28v=vs.80%29.aspx&lt;/a&gt; &lt;br /&gt;&lt;a target="_blank" href="http://webhub.com/dynhelp:viewTn::catalog=TnNote,id=recycledefaultapppool"&gt;http://webhub.com/dynhelp:viewTn::catalog=TnNote,id=recycledefaultapppool&lt;/a&gt; &lt;br /&gt;&lt;a target="_blank" href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sc.mspx?mfr=true"&gt;http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sc.mspx?mfr=true&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205841" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/snippets/default.aspx">snippets</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Batch/default.aspx">Batch</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/CRM/default.aspx">CRM</category></item><item><title>Javascript Private Shared Variables</title><link>http://geeks.ms/blogs/crisfervil/archive/2012/06/19/javascript-private-shared-variables.aspx</link><pubDate>Tue, 19 Jun 2012 10:13:44 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205669</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=205669</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2012/06/19/javascript-private-shared-variables.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" alt="" align="right" src="https://encrypted-tbn1.google.com/images?q=tbn:ANd9GcQ05YJ_s3pUbrosnT3WQPxL3xaM5PtF6a2A0mLjXdBgj_sqT8Vq" width="225" height="225" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Apunto este trozo de código pues contiene un concepto interesante que puede ayudar cuando trabajas con Javascript.&lt;/p&gt;  &lt;p&gt;Esta técnica permite definir una variable, cuyo ámbito se limita a una función, pero cuyo valor se comparte entre distintas llamadas.&lt;/p&gt;  &lt;p&gt;Se parece a las variables privadas estáticas que existían en Visual Basic 6. La idea es la misma.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; MyFunction() {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (!MyFunction.Value1) { &lt;span class="rem"&gt;// Set the default Value&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        MyFunction.Value1 = &lt;span class="str"&gt;&amp;quot;Default Value&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;else&lt;/span&gt; {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="rem"&gt;// The value has been already set   &lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        MyFunction.Value1 = &lt;span class="str"&gt;&amp;quot;Modified Value&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; MyFunction.Value1;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;}&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;alert(&lt;span class="str"&gt;&amp;quot;1:&amp;quot;&lt;/span&gt; + MyFunction());&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;alert(&lt;span class="str"&gt;&amp;quot;2:&amp;quot;&lt;/span&gt; + MyFunction());&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&lt;span class="rem"&gt;// The value is not accesible from outside&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;MyFunction.Value1 = &lt;span class="str"&gt;&amp;quot;Outside modification&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;alert(&lt;span class="str"&gt;&amp;quot;3:&amp;quot;&lt;/span&gt; + MyFunction());&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;Pruébalo en &lt;strong&gt;JS Fiddle&lt;/strong&gt;: &lt;a title="http://jsfiddle.net/69bdw/" href="http://jsfiddle.net/69bdw/" target="_blank"&gt;http://jsfiddle.net/69bdw/&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Básicamente, lo que hacemos es tratar a MyFunction como si fuera un objeto, y asignarle una propiedad.&lt;/p&gt;

&lt;p&gt;El valor Value1 existe dentro del contexto de MyFunction, y sólo es modificable desde dentro de él. Además su valor persiste entre llamadas.&lt;/p&gt;

&lt;p&gt;Una aplicación interesante de este concepto podría ser una función, que atendiese un evento que se dispara repetidamente, pero para el que sólo realizaremos una acción cada cierto tiempo. Por ejemplo, el resize de la ventana.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;HTML:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;height:100px;border:solid 2px;&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;#39;div1&amp;#39;&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;position:relative;background-color:red;width:50px;height:50px;top:25px;&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;JS: &lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; SetupPosition(){&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; div1 = document.getElementById(&lt;span class="str"&gt;&amp;#39;div1&amp;#39;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; parentContainer = div1.parentElement;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; leftValue = (parentContainer.offsetWidth / 2) -&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                    (div1.offsetWidth / 2);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    div1.style.left = leftValue+&lt;span class="str"&gt;&amp;quot;px&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;}&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; OnWindowResize() {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;Handler for the window resize event&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (OnWindowResize.TimerId) { &lt;span class="rem"&gt;// If the timer has already been set&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="rem"&gt;// Clear it in order to avoid multiple executions&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        window.clearTimeout(OnWindowResize.TimerId);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="rem"&gt;// Set a timeout to calculate the element position&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    OnWindowResize.TimerId = window.setTimeout(SetupPosition, 500);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&lt;span class="rem"&gt;// Handle the window resize Event&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;window.onresize = OnWindowResize;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;&lt;font size="2"&gt;Pruébalo en &lt;strong&gt;JS Fiddle&lt;/strong&gt;: &lt;/font&gt;&lt;a title="http://jsfiddle.net/3DNBk/" href="http://jsfiddle.net/3DNBk/" target="_blank"&gt;http://jsfiddle.net/3DNBk/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;La función OnWindowResize comprueba que exista una ejecución previa del window.setTimeout “mirando” en su propiedad TimerId.&lt;/p&gt;

&lt;p&gt;Si la hay, cancela la ejecución, y vuelve a planificar otra para dentro de medio segundo.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205669" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Web+Development/default.aspx">Web Development</category></item><item><title>HTML Base Tag. Postback en ventanas modales</title><link>http://geeks.ms/blogs/crisfervil/archive/2012/02/13/html-base-tag-postback-en-ventanas-modales.aspx</link><pubDate>Mon, 13 Feb 2012 09:01:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:203328</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=203328</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2012/02/13/html-base-tag-postback-en-ventanas-modales.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_78937325.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_371DE22E.png" width="269" height="141" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Me he encontrado más de una vez con el siguiente problema: Si se produce un postback en una ventana modal, el resultado de ese postback se carga en una nueva ventana, en lugar de hacerlo en la propia ventana modal.&lt;/p&gt;  &lt;p&gt;Esto ocurre independientemente del evento que cause el postback: El click de un botón, el cambio de valor de un desplegable, etc.&lt;/p&gt;  &lt;p&gt;Este comportamiento sólo ocurre con Internet Explorer.&lt;/p&gt;  &lt;p&gt;Solución? este maravilloso Tag HTML: &lt;/p&gt;  &lt;p&gt;base target=”_self”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4EDA3AF6.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_16543C3E.png" width="720" height="180" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Con ponerlo, se corrige el problema.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Y ya que estamos, qué hace ese tag?&lt;/p&gt;  &lt;p&gt;Indica qué frame, o ventana se usará &lt;u&gt;por defecto&lt;/u&gt; para cargar los enlaces. Esto, está pensado para aquellas ventanas que tienen varios elementos &amp;lt;&lt;strong&gt;&lt;em&gt;iframe&lt;/em&gt;&lt;/strong&gt;&amp;gt;.&lt;/p&gt;  &lt;p&gt;Los iframes, tienen un atributo &lt;strong&gt;name&lt;/strong&gt;, que sirve para identificarlos. Además, los iframes se pueden anidar.&lt;/p&gt;  &lt;p&gt;Este tag tiene la misma función que el atributo target de la etiqueta &lt;strong&gt;&lt;em&gt;&amp;lt;a&amp;gt;&lt;/em&gt;&lt;/strong&gt;, la que sirve para especificar los hyperlinks.&lt;/p&gt;  &lt;p&gt;Debe ser que en las ventanas modales, internet explorer asigna por defecto el valor _blank a este atributo.&lt;/p&gt;  &lt;p&gt;Posibles valores del atributo target:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="112"&gt;&lt;strong&gt;Valor&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="288"&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="112"&gt;_blank&lt;/td&gt;        &lt;td valign="top" width="288"&gt;Abre el enlace en una nueva ventana o pestaña&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="112"&gt;_self&lt;/td&gt;        &lt;td valign="top" width="288"&gt;Abre el enlace en el mismo frame en que se encuentra el enlace&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="112"&gt;_parent&lt;/td&gt;        &lt;td valign="top" width="288"&gt;Abre el enlace en el parent frame, o contenedor del frame en el que se encuentra el enlace&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="112"&gt;_top&lt;/td&gt;        &lt;td valign="top" width="288"&gt;Si la ventana actual tiene varios iframes, los ignora todos y carga el enlace en la ventana actual.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="112"&gt;&lt;i&gt;framename&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="288"&gt;Abre el enlace en el frame con el nombre especificado.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Adjunto código que muestra el funcionamiento y la corrección&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a title="Código Ejemplo Skydrive" href="https://skydrive.live.com/redir.aspx?cid=da2e56199efa5596&amp;amp;resid=DA2E56199EFA5596!207&amp;amp;parid=DA2E56199EFA5596!157&amp;amp;authkey=!ADYnb3vGs0pNcGA" target="_blank"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image1_5F00_78ABD139.png" width="202" height="186" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_535A3CDA.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1421349F.png" width="649" height="215" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Enlaces&lt;/strong&gt;:     &lt;br /&gt;&lt;a title="http://www.w3schools.com/tags/att_base_target.asp" href="http://www.w3schools.com/tags/att_base_target.asp"&gt;http://www.w3schools.com/tags/att_base_target.asp&lt;/a&gt;     &lt;br /&gt;&lt;a title="http://www.w3schools.com/tags/tag_a.asp" href="http://www.w3schools.com/tags/tag_a.asp"&gt;http://www.w3schools.com/tags/tag_a.asp&lt;/a&gt;     &lt;br /&gt;&lt;a title="http://www.w3schools.com/tags/tag_iframe.asp" href="http://www.w3schools.com/tags/tag_iframe.asp"&gt;http://www.w3schools.com/tags/tag_iframe.asp&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=203328" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/HTML/default.aspx">HTML</category></item><item><title>Industria Software España</title><link>http://geeks.ms/blogs/crisfervil/archive/2012/01/26/industria-software-espa-241-a.aspx</link><pubDate>Thu, 26 Jan 2012 11:10:31 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:203009</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=203009</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2012/01/26/industria-software-espa-241-a.aspx#comments</comments><description>&lt;p&gt;Interesante artículo.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.presionblogosferica.com/2010/09/30/por-que-digo-que-no-hay-una-industria-del-software-en-espana/" href="http://www.presionblogosferica.com/2010/09/30/por-que-digo-que-no-hay-una-industria-del-software-en-espana/" target="_blank"&gt;http://www.presionblogosferica.com/2010/09/30/por-que-digo-que-no-hay-una-industria-del-software-en-espana/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Jeje, me quedo con dos frases del autor, &lt;strong&gt;&lt;a href="http://www.presionblogosferica.com/acerca-de/cv1/" target="_blank"&gt;Ángel Medinilla&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Un programador es un ente que alimentamos con UML y escupe código.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Hay programadores que son incapaces de distinguir entre un ordenador y un piano.&lt;/p&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=203009" width="1" height="1"&gt;</description></item><item><title>JSTreeGraph. HTML4+Javascript Tree Graph</title><link>http://geeks.ms/blogs/crisfervil/archive/2012/01/18/jstreegraph-html4-javascript-tree-grahp.aspx</link><pubDate>Wed, 18 Jan 2012 18:00:09 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:202870</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=202870</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2012/01/18/jstreegraph-html4-javascript-tree-grahp.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_08F024B6.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="308" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_60E00647.png" width="715" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Imagen: Árbol en modo Horizontal.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_26F3540C.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="351" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_68902109.png" width="592" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Imagen: Árbol en modo Vertical.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Llevo tiempo buscando algún componente que me permita representar en un entorno web, información jerárquica en cajitas. Hasta hoy no he dado con ninguna opción que cubra mis requerimientos; esto es, que no necesite plug-ins adicionales (flash, silverlight, etc.), que no haya que pagar licencias, y que permita mostrar la jerarquía tanto en vertical como en horizontal.&lt;/p&gt;  &lt;p&gt;Estudiando detenidamente &lt;a href="http://www.yworks.com/en/index.html"&gt;esta&lt;/a&gt; solución existente, me he de dado cuenta de que la lógica que hay detrás de estos árboles no parece muy complicada. Básicamente se trata de pintar una cajita por cada nodo, y unas líneas que las unan.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_20D128D3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="519" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_68B4CC5E.png" width="789" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Imagen: Componente Silverlight de YWorks&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Así que, ya se sabe, a reinventar la rueda; me puse a programarlo. Y he llegado a la conclusión de que es más difícil de lo que parece. Aunque tampoco es para tanto :) Eso sí, se aprende un montón.&lt;/p&gt;  &lt;p&gt;Las dificultades con las que me he encontrado son: &lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Dibujar líneas sobre una capa en HTML&lt;/strong&gt;: Con HTML5 y los lienzos, es fácil. Pero con HTML4, hay que aplicar algún truquillo. &lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;El Layout, o dónde va cada cajita&lt;/strong&gt;: Dar con un algoritmo, medianamente eficiente que permita conocer la posición de cada cajita, me ha traído de cabeza, pero ha salido… y creo que no ha quedado mal.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Dibujar líneas sobre una Capa HTML&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Investigando un poco &lt;a href="http://www.google.com/" target="_blank"&gt;por ahí&lt;/a&gt;, he dado con un par de artículos que comentaban el problema. Básicamente hay tres posibilidades para resolverlo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.p01.org/releases/Drawing_lines_in_JavaScript/" target="_blank"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="216" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_10E99622.png" width="328" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Dibujar una capa de un pixel por un pixel en cada punto de la línea&lt;/strong&gt;. El inconveniente evidente de esta técnica es que es muy ineficiente.&lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Usar una imagen con una línea en diagonal&lt;/strong&gt;, hacia arriba o hacia abajo, y redimensionarla hasta ajustarla a los puntos necesarios. El inconveniente de esta técnica es que las líneas quedan muy pixeladas. La ventaja es que es muy eficiente.&lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Usar un div que tenga la longitud total de la línea&lt;/strong&gt;. Esto sólo funciona para líneas rectas. La ventaja es que no se requieren imágenes adicionales, y es muy óptimo. Es la técnica que he utilizado, ya que, al menos en esta primera versión, sólo permitiré unir las cajitas con líneas rectas.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4E0D51A7.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="295" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_444A7AE0.png" width="558" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Lo que hacemos en esta función es crear una capa de &lt;strong&gt;&lt;em&gt;lineWidth&lt;/em&gt;&lt;/strong&gt; píxeles de grosor, con una longitud o determinada por la diferencia de posición de los puntos X e Y de los parámetros.&lt;/p&gt;  &lt;p&gt;Como podemos ver, es bastante sencillo. Quizá lo más destacable es la manera en que se conoce si la línea es vertical u horizontal: si la coordenada&lt;strong&gt; X&lt;/strong&gt; del punto de inicio de la línea es la misma que la coordenada &lt;strong&gt;X &lt;/strong&gt;del punto final, entonces se trata de una línea vertical.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_781501E2.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="366" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_67305DF2.png" width="437" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;El Layout, o la disposición de las cajitas.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Para este tema, que ha costado bastante, he usado varias funciones recursivas, que establecen la posición de cada nodo.&lt;/p&gt;  &lt;p&gt;El posicionamiento es distinto si pintamos el árbol en modo horizontal o vertical. Explicaré el posicionamiento Horizontal, pues parece más fácil de ver. Comprendido éste, el posicionamiento Vertical es exactamente igual, pero jugando con la posición superior de las cajitas, en lugar de la posición izquierda.&lt;/p&gt;  &lt;p&gt;Como es necesario pasearse por la estructura del árbol, y calcular constantemente el nivel, la referencia al nodo padre, y al nodo que está a la izquierda en el mismo nivel (LeftNode), he creado una función que realiza todo este cálculo una única vez, al principio. Esta función es la función &lt;strong&gt;&lt;em&gt;PrepareNode&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5FA77F36.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="352" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_5095C1BE.png" width="710" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;El LeftNode de un nodo es el que está inmediatamente a la izquierda en el mismo nivel. De este modo puedo navegar por el árbol de arriba a abajo, entre niveles, mediante las propiedades ParentNode y Nodes, y horizontalmente dentro de un mismo nivel mediante la propiedad LeftNode.&lt;/p&gt;  &lt;p&gt;El parámetro rightLimits, es un array que contiene para cada nivel, el último nodo hijo analizado. Es un atajo para conocer cuál es LeftNode que está en una rama distinta de la que estoy analizando.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5E2310CA.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="336" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_76490BD6.png" width="403" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Habiendo pues, analizado cada nodo, y realizado este cálculo previo, pasmos a calcular las posiciones de cada cajita.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;La función PerformLayout(node)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Esta es una función también recursiva. Su función es establecer las coordenadas de posición y el tamaño de cada una de las cajitas.&lt;/p&gt;  &lt;p&gt;El parámetro de entrada de esta función es un nodo.&lt;/p&gt;  &lt;p&gt;(1) Para conocer la posición de un nodo, lo primero que hemos de saber es si tiene hijos; si no los tiene (6) la posición izquierda será la del nodo inmediatamente a la izquierda, más un margen predefinido.&lt;/p&gt;  &lt;p&gt;(2) Si el nodo tiene hijos, entra en juego la recursividad, pues volvemos a llamar a la función para cada uno de los hijos. Esta característica hace que se analicen en primer lugar los nodos finales de cada rama. Y esto está bien, pues normalmente la posición de un nodo irá condicionada por la posición de los elementos que tiene por debajo. Si el nodo no tiene hijos en cambio, el se pinta al lado del que tenga a la izquierda.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_27D99ACE.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="606" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2F8724DF.png" width="628" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Una vez analizados los hijos, (3) utilizamos los resultados del paso anterior, localizamos el centro, y posicionamos el nodo en ese punto. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_37373FA1.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="188" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_26552C62.png" width="703" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Puede ocurrir que ese centro se superponga con el nodo de la izquierda(4), con lo que hay que mover a la derecha(5) el nodo en cuestión, y todos sus descendientes. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1E601AB1.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="156" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_505A4BEC.png" width="519" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Imagen: El centro de los nodos hijos se superpone con el de la izquierda.&lt;/p&gt;  &lt;p&gt;A continuación, (7) queda calcular la posición superior, el ancho y alto de cada cajita. La posición superior va en función del nivel, y el ancho y alto son valores constantes.&lt;/p&gt;  &lt;p&gt;Por último, debemos indicar las coordenadas de los puntos de anclaje de los conectores(8). ¿Y qué es esto? Son los puntos donde está el inicio de la línea en caso de un nodo padre, y el fin de la línea en caso de un nodo hijo. Conociendo la izquierda, derecha, ancho y alto de cada nodo, este valor es muy fácil de calcular.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_0D7E0772.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="207" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_10B510BC.png" width="453" border="0" /&gt;&lt;/a&gt;     &lt;br /&gt;Imagen: Puntos de Anclaje. &lt;/p&gt;  &lt;p&gt;Una vez calculadas las posiciones, ya sólo es cuestión de recorrerlos y pintar en cada posición una cajita. Y por último las líneas que conectan padres e hijos.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6D1E03C5.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="324" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_255F0B8F.png" width="167" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Imagen: Flujo Completo.&lt;/p&gt;  &lt;p&gt;Este mismo algoritmo es el que se utiliza para calcular las posiciones de los nodos en el modo Vertical. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;El código fuente y los ejemplos están publicados en Codeplex: &lt;a title="http://jstreegraph.codeplex.com" href="http://jstreegraph.codeplex.com"&gt;http://jstreegraph.codeplex.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Referencias&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.p01.org/releases/Drawing_lines_in_JavaScript/" href="http://www.p01.org/releases/Drawing_lines_in_JavaScript/"&gt;http://www.p01.org/releases/Drawing_lines_in_JavaScript/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.yworks.com/products/yfilessilverlight/Demo.yFiles.Graph.Collapse.html" href="http://www.yworks.com/products/yfilessilverlight/Demo.yFiles.Graph.Collapse.html"&gt;http://www.yworks.com/products/yfilessilverlight/Demo.yFiles.Graph.Collapse.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://jsdraw2d.jsfiction.com/" href="http://jsdraw2d.jsfiction.com/"&gt;http://jsdraw2d.jsfiction.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://en.wikipedia.org/wiki/Graph_drawing" href="http://en.wikipedia.org/wiki/Graph_drawing"&gt;http://en.wikipedia.org/wiki/Graph_drawing&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202870" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Graph/default.aspx">Graph</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Tree/default.aspx">Tree</category></item><item><title>Arrays vs Dictionaries</title><link>http://geeks.ms/blogs/crisfervil/archive/2011/10/10/arrays-vs-dictionaries.aspx</link><pubDate>Mon, 10 Oct 2011 12:36:13 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201111</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=201111</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2011/10/10/arrays-vs-dictionaries.aspx#comments</comments><description>&lt;p&gt;Tengo la necesidad de cargar en memoria una tabla con un gran volumen de datos. Hablamos de una tabla de millones de registros. Además la estructura de los datos no es conocida a priori. Los tipos de cada columna y su número se conocen después de ejecutar una consulta a base de datos.&lt;/p&gt;  &lt;p&gt;Entonces me surge la duda: Qué sería más óptimo en cuanto al consumo de memoria? ¿Usar Arrays o Diccionarios?&lt;/p&gt;  &lt;p&gt;La ventaja principal de los diccionarios es que me permite añadir filas a la tabla sin tener que preocuparme por redimensionar cada vez el array. Además, puedo acceder a los valores de la tabla usando un nombre, en lugar de usar un índice.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_18A51F27.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_77B1AC7F.png" width="320" height="28" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Para salir de dudas, he hecho una prueba, un poco simplona, pero que me ha sacado de dudas:&lt;/p&gt;  &lt;p&gt;Primero, he hecho una carga en memoria de una tabla de 100 columnas y un millón de registros, usando un diccionario y una lista genérica.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_16F45353.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1543877F.png" width="600" height="408" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Al ejecutar esto…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7EA13937.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_4AF8CCD9.png" width="471" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vaya, nisiquiera llega a cargar el millón de registros. Se ha quedado&amp;#160; en 185.000 filas.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_304C30C0.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_41505EA3.png" width="292" height="172" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A ver qué pasa con los arrays…&lt;/p&gt;  &lt;p&gt;Lo mismo, pero con menos registros&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7F697954.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2DFF8237.png" width="652" height="337" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_414038D6.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_6735E92C.png" width="306" height="159" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vuelvo a ejecutar la prueba, para cada una de las opciones, pero esta vez reduciendo el número de columnas a 10.&lt;/p&gt;  &lt;p&gt;Esta vez, ambos procesos acaban sin el error de memoria.&lt;/p&gt;  &lt;p&gt;El consumo de memoria es en el caso de los arrays es de 916MB&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_783A170F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_24769DF4.png" width="430" height="350" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;En el caso de las listas y diccionarios es de 929MB&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_3BC1A265.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_7327B393.png" width="419" height="342" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Lo que sí he notado, pero no he querido entretenerme en comprobarlo, es que en el caso de los arrays el tiempo de ejecución era menor, lo que indica un acceso a memoria más óptimo en el caso de los arrays.&lt;/p&gt;  &lt;p&gt;De todos modos me he decantado por usar las listas, pues la prioridad era el consumo de memoria frente al tiempo de proceso. &lt;/p&gt;  &lt;p&gt;Hemos visto que el consumo de memoria es el prácticamente el mismo en ambos casos, pero usando los diccionarios, la programación es más cómoda, pudiéndose referenciar columnas por su nombre. Es posible que esto último ayude incluso a reducir el número de errores.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201111" width="1" height="1"&gt;</description></item><item><title>Convert ListaGenerica a DataTable</title><link>http://geeks.ms/blogs/crisfervil/archive/2011/07/06/convert-listagenerica-a-datatable.aspx</link><pubDate>Wed, 06 Jul 2011 13:43:07 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:197314</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=197314</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2011/07/06/convert-listagenerica-a-datatable.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7E9C29E3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="129" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_46EC0064.png" width="129" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Me apunto por aquí un trozo de código que permite convertir una Lista Genérica (por ejemplo de entidades) a un DataTable. Es totalmente compatible con el Framework 2.&lt;/p&gt;  &lt;p&gt;Para convertir una Lista Genérica en un DataTable, debemos primeramente obtener por reflexión las propiedades públicas de los elementos de la lista genérica. Cada una de estas propiedades corresponderá a una columna de la Tabla. &lt;/p&gt;  &lt;p&gt;A continuación, deberemos recorrer los elementos de la lista genérica, y añadir una fila a la tabla por cada item de la lista.&lt;/p&gt;  &lt;p&gt;Hay que tener cuidado con los tipos nullables. No están soportados en los DataTables.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// Convert data from a generyc list to a DataTable&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; DataTable Convert&amp;lt;TItemType&amp;gt;(List&amp;lt;TItemType&amp;gt; list)
{
    DataTable convertedData = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable();

    &lt;span class="rem"&gt;// Get List Item Properties info&lt;/span&gt;
    Type itemType = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(TItemType);
    PropertyInfo[] publicProperties =
        &lt;span class="rem"&gt;// Only public non inherited properties&lt;/span&gt;
        itemType.GetProperties(BindingFlags.Instance | BindingFlags.Public);

    &lt;span class="rem"&gt;// Create Table Columns&lt;/span&gt;
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (PropertyInfo property &lt;span class="kwrd"&gt;in&lt;/span&gt; publicProperties)
    {
        &lt;span class="rem"&gt;// DataSet does not support System.Nullable&amp;lt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (property.PropertyType.IsGenericType &amp;amp;&amp;amp;
            property.PropertyType.GetGenericTypeDefinition() == &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Nullable&amp;lt;&amp;gt;))
        {
            &lt;span class="rem"&gt;// Set the column datatype as the nullable value type&lt;/span&gt;
            convertedData.Columns.Add(property.Name, property.PropertyType.GetGenericArguments()[0]);
        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt;
        {
            convertedData.Columns.Add(property.Name, property.PropertyType);
        }
    }

    &lt;span class="rem"&gt;// Convert the Data&lt;/span&gt;
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (TItemType item &lt;span class="kwrd"&gt;in&lt;/span&gt; list)
    {
        &lt;span class="kwrd"&gt;object&lt;/span&gt;[] rowData = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[convertedData.Columns.Count];
        &lt;span class="kwrd"&gt;int&lt;/span&gt; rowDataIndex = 0;
        &lt;span class="rem"&gt;// Iterate through Item Properties&lt;/span&gt;
        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (PropertyInfo property &lt;span class="kwrd"&gt;in&lt;/span&gt; publicProperties)
        {
            &lt;span class="rem"&gt;// Add a single cell data&lt;/span&gt;
            rowData[rowDataIndex] = property.GetValue(item, &lt;span class="kwrd"&gt;null&lt;/span&gt;);
            rowDataIndex++;
        }
        convertedData.Rows.Add(rowData);
    }

    &lt;span class="kwrd"&gt;return&lt;/span&gt; convertedData;
}&lt;/pre&gt;


&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Y la operación inversa; Convertir una DataTable en una lista Genérica.&lt;/p&gt;

&lt;p&gt;En este caso, lo primero será ver qué columnas de la tabla son propiedades públicas en los elementos de la lista. Las demás, no podré convertirlas, o al menos no directamente. &lt;/p&gt;

&lt;p&gt;A continuación, recorremos las filas de la tabla, e instanciamos un elemento de la lista por cada fila. Asignamos por reflexión los valores a las propiedades, y añadimos la nueva instancia a la lista. &lt;/p&gt;

&lt;p&gt;Este código también tiene en cuenta las conversiones entre Null y System.DBNull. Recordemos que en los DataTable se utiliza este valor para indicar un valor nulo. Esto seguramente es así, porque los DataTable son anteriores a la aparición de los tipos Nullables.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// Fills a generyc list with the data cointained in a DataTable&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; List&amp;lt;TItemType&amp;gt; Convert&amp;lt;TItemType&amp;gt;(DataTable dt) &lt;span class="kwrd"&gt;where&lt;/span&gt; TItemType:&lt;span class="kwrd"&gt;new&lt;/span&gt;()
{
    List&amp;lt;TItemType&amp;gt; convertedData = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;TItemType&amp;gt;();

    &lt;span class="rem"&gt;// Get List Item Properties info&lt;/span&gt;
    Type itemType = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(TItemType);
    
    &lt;span class="rem"&gt;// Only public non inherited properties&lt;/span&gt;
    BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public;

    &lt;span class="rem"&gt;// wich columns of the datatable are properties of TItemType?&lt;/span&gt;
    Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;,PropertyInfo&amp;gt; availableProperties = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, PropertyInfo&amp;gt;();
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (DataColumn column &lt;span class="kwrd"&gt;in&lt;/span&gt; dt.Columns)
    {
        PropertyInfo prop = itemType.GetProperty(column.ColumnName, bindingFlags);
        &lt;span class="kwrd"&gt;if&lt;/span&gt;(prop!=&lt;span class="kwrd"&gt;null&lt;/span&gt;) availableProperties.Add(column.ColumnName,prop);
    }

    &lt;span class="rem"&gt;// Fill the generyc list with data&lt;/span&gt;
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (DataRow row &lt;span class="kwrd"&gt;in&lt;/span&gt; dt.Rows)
    {
        TItemType item = &lt;span class="kwrd"&gt;new&lt;/span&gt; TItemType();
        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, PropertyInfo&amp;gt; availableProperty &lt;span class="kwrd"&gt;in&lt;/span&gt; availableProperties)
        {
            &lt;span class="kwrd"&gt;object&lt;/span&gt; propValue = row[availableProperty.Key];
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (propValue!=&lt;span class="kwrd"&gt;null&lt;/span&gt;&amp;amp;&amp;amp;propValue!=System.DBNull.Value)
                availableProperty.Value.SetValue(item, propValue, &lt;span class="kwrd"&gt;null&lt;/span&gt;);                

        }
        convertedData.Add(item);
    }

    &lt;span class="kwrd"&gt;return&lt;/span&gt; convertedData;
}&lt;/pre&gt;


&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Por último, cómo probaríamos este código? Unit Testing a Tope!&lt;/p&gt;

&lt;p&gt;Por ejemplo, puedo declarar una entidad de prueba, cargar una lista con datos aleatorios, y ver que tras la conversión a DataTable, la Tabla tiene tantas columnas como propiedades públicas tiene la entidad, y que el número de elementos coincide.&lt;/p&gt;

&lt;p&gt;Y al hacer la operación inversa, ver que el número de elementos es el mismo.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;List&amp;lt;TestEntity&amp;gt; myItems = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;TestEntity&amp;gt;();

&lt;span class="rem"&gt;// Generate Random Data&lt;/span&gt;
Random r = &lt;span class="kwrd"&gt;new&lt;/span&gt; Random(System.DateTime.Now.Millisecond);
&lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 10; i++)
{
    TestEntity newItem = &lt;span class="kwrd"&gt;new&lt;/span&gt; TestEntity();
    newItem.Name = Guid.NewGuid().ToString();
    newItem.Birthday = DateTime.Now.AddHours(r.Next(1000));
    newItem.LastBillDate = r.Next()%2 == 0 ? &lt;span class="kwrd"&gt;null&lt;/span&gt; : &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime?(DateTime.Now.AddHours(r.Next(1000)));
    newItem.LastBillAmount = r.Next() % 2 == 0 ? &lt;span class="kwrd"&gt;null&lt;/span&gt; : &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt;?(r.NextDouble());
    myItems.Add(newItem);
}

DataTable dt1 = Converter.Convert&amp;lt;TestEntity&amp;gt;(myItems);
&lt;span class="rem"&gt;// The date table columns count and the public properties must be the same&lt;/span&gt;
Assert.AreEqual(dt1.Columns.Count,&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(TestEntity).GetProperties(BindingFlags.Instance | BindingFlags.Public).Length);
Assert.AreEqual(dt1.Rows.Count,myItems.Count);

&lt;span class="rem"&gt;// Re convert to an Entity List&lt;/span&gt;
List&amp;lt;TestEntity&amp;gt; myConvertedItems = Converter.Convert&amp;lt;TestEntity&amp;gt;(dt1);
Assert.AreEqual(myItems.Count, myConvertedItems.Count);&lt;/pre&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=197314" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/dotNetFramework/default.aspx">dotNetFramework</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/snippets/default.aspx">snippets</category></item><item><title>Deshabilitar Boton Guardar en PDF</title><link>http://geeks.ms/blogs/crisfervil/archive/2011/03/15/deshabilitar-boton-guardar-en-pdf.aspx</link><pubDate>Tue, 15 Mar 2011 08:18:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:190389</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=190389</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2011/03/15/deshabilitar-boton-guardar-en-pdf.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_043F9089.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_73EE5B93.png" border="0" height="288" width="621" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Qu&amp;eacute; duda cabe que el formato PDF se ha popularizado tanto, que ha llegado a convertirse en un est&amp;aacute;ndar en el intercambio de documentos. Hoy en d&amp;iacute;a, cualquiera de las aplicaciones que manejamos permite exportar informaci&amp;oacute;n usando este formato.&lt;/p&gt;
&lt;p&gt;Muchas veces, nos encontramos con usuarios que manejan informaci&amp;oacute;n confidencial, y desean que sus documentos est&amp;eacute;n de alguna manera &lt;span style="text-decoration:underline;"&gt;controlados&lt;/span&gt;. Que a ser posible, no salgan de sus instalaciones. Que sus empleados, o las personas que tengan acceso a dicha informaci&amp;oacute;n, s&amp;oacute;lo puedan visualizarla, pero que no tengan la posibilidad de copiarla y distribuirla.&lt;/p&gt;
&lt;p&gt;A d&amp;iacute;a de hoy, esta es una funcionalidad que es bastante complicada conseguir. Y lo es, porque en teor&amp;iacute;a, cualquier contenido &lt;span style="text-decoration:underline;"&gt;al que tengamos acceso&lt;/span&gt;, es susceptible de ser copiado y posteriormente distribuido. &lt;/p&gt;
&lt;p&gt;El formato PDF no es ajeno a esta caracter&amp;iacute;stica. Una vez puestos los medios para impedir que &lt;span style="text-decoration:underline;"&gt;personas no adecuadas&lt;/span&gt; tengan acceso al documento, (porque en impedir el acceso s&amp;iacute; se pueden poner muchas medidas de seguridad) y el&amp;nbsp; usuario ha conseguido visualizarlo en pantalla, hay poco que podamos hacer; Si est&amp;aacute;n los bits, estos se pueden copiar. Y si se pueden copiar, se pueden distribuir.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Se puede usar el viejo truco de imprimir la pantalla, imprimir el documento y volver a escanearlo, copiarlo con l&amp;aacute;piz y papel, memorizarlo, hacer una foto con el m&amp;oacute;vil, y un mont&amp;oacute;n de cosas que est&amp;aacute;n ah&amp;iacute;, y no son complicadas de abordar.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_3A01A958.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3136C26E.png" border="0" height="170" width="424" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Como contramedida, lo que podemos hacer, es al menos, eliminar los medios de distribuci&amp;oacute;n m&amp;aacute;s evidentes, como el bot&amp;oacute;n guardar del Reader.&lt;/p&gt;
&lt;p&gt;Existen &lt;span style="text-decoration:underline;"&gt;par&amp;aacute;metros&lt;/span&gt; que pueden pasarse al Reader para deshabilitar las barras de herramientas, el men&amp;uacute;, la barra de estado, etc..&lt;/p&gt;
&lt;p&gt;Se puede adem&amp;aacute;s indicar qu&amp;eacute; p&amp;aacute;gina del documento se mostrar&amp;aacute;, el nivel de zoom, incluso si queremos realizar autom&amp;aacute;ticamente una b&amp;uacute;squeda dentro del documento.&lt;/p&gt;
&lt;p&gt;Referencia a la lista de par&amp;aacute;metros disponibles:&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf" href="http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf"&gt;http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los par&amp;aacute;metros pueden pasarse por API, por l&amp;iacute;nea de comandos, por URL, o dentro del tag object de un documento html.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Por ejemplo:&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Acrobat.exe /A &amp;quot;zoom=1000&amp;quot; &amp;quot;C:\example.pdf&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;http://example.org/doc.pdf#page=3&amp;amp;pagemode=thumbs&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_673DD22C.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1A9C263A.png" border="0" height="179" width="633" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Con Toolbar.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_0E9CC6B7.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_200FB840.png" border="0" height="149" width="644" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Sin Toolbar.&lt;/p&gt;
&lt;p&gt;Existen tambi&amp;eacute;n otras alternativas. Como usar viewers en los que podemos controlar ciertos par&amp;aacute;metros, como el de las toolbars, el men&amp;uacute; contextual, etc.&lt;/p&gt;
&lt;p&gt;Van dos ejemplos de viewers en Silverlight.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.pdftron.com/silverdox/"&gt;http://www.pdftron.com/silverdox/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_15E0AE84.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_640DB94E.png" border="0" height="421" width="644" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;PDF Tron. Silverlight. Sin Toolbar. El men&amp;uacute; contextual no permite copiar.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://firstfloorsoftware.com/documenttoolkit"&gt;http://firstfloorsoftware.com/documenttoolkit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_12F58C95.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_145C4018.png" border="0" height="421" width="644" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;First Floor Document Toolkit for Silverlight. Impide guardar el documento, copiarlo, pegarlo, etc.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://es.wikipedia.org/wiki/PDF" href="http://es.wikipedia.org/wiki/PDF"&gt;http://es.wikipedia.org/wiki/PDF&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En cuanto a impedir que la informaci&amp;oacute;n llegue a manos equivocadas, tenemos a nuestra disposici&amp;oacute;n, el servidor de Rights Management.&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.microsoft.com/windowsserver2003/technologies/rightsmgmt/default.mspx" href="http://www.microsoft.com/windowsserver2003/technologies/rightsmgmt/default.mspx"&gt;http://www.microsoft.com/windowsserver2003/technologies/rightsmgmt/default.mspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows Rights Management impide que los documentos protegidos puedan ser abiertos, impresos, reenviados, etc, a personas no autorizadas.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6E88AA65.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_349BF82A.png" border="0" height="320" width="330" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_48B7A564.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_033535EA.png" border="0" height="221" width="514" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Como conclusi&amp;oacute;n, yo dir&amp;iacute;a que cuando nos encontremos con un requerimiento de este tipo, lo mejor es informar al usuario de los riesgos existentes y de las alternativas viables. El riesgo de fuga de informaci&amp;oacute;n siempre estar&amp;aacute; ah&amp;iacute;, y en &amp;uacute;ltima instancia, no existe m&amp;aacute;s remedio que intentar restringir al m&amp;aacute;ximo la informaci&amp;oacute;n confidencial y concienciar al usuario de los riesgos que supone no tenerla controlada. Normalmente, antes de ense&amp;ntilde;ar informaci&amp;oacute;n confidencial, se suele pedir al usuario que acepte unos t&amp;eacute;rminos de &lt;a href="http://es.wikipedia.org/wiki/Non-disclosure_agreement" target="_blank"&gt;NDA (Non Disclosure Agreement)&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=190389" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx">General</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/PDF/default.aspx">PDF</category></item><item><title>StackOverflowException en ASP.net</title><link>http://geeks.ms/blogs/crisfervil/archive/2011/03/10/stackoverflowexception-en-asp-net.aspx</link><pubDate>Thu, 10 Mar 2011 07:57:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:190189</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=190189</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2011/03/10/stackoverflowexception-en-asp-net.aspx#comments</comments><description>&lt;p&gt;Apunto este snippet, como recordatorio.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7A3C5C75.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_75EA8703.png" border="0" height="342" width="842" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Como indica el comentario del c&amp;oacute;digo, me ha ocurrido que necesitaba ejecutar una funci&amp;oacute;n recursiva, que recorriese un &amp;aacute;rbol en busca de un nodo.&lt;/p&gt;
&lt;p&gt;Como mi &amp;aacute;rbol hab&amp;iacute;a sido construido por el usuario, y no exist&amp;iacute;an validaciones que lo impidiesen, estaba realizando una b&amp;uacute;squeda recursiva, en la que uno de los nodos hijo era a su vez padre en la misma rama.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_44813412.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_56CC8B85.png" border="0" height="225" width="286" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Y como indica la MSDN&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Starting with the .NET Framework version 2.0, a StackOverflowException object cannot be caught by a try-catch block and the corresponding process is terminated by default. Consequently, users are advised to write their code to detect and prevent a stack overflow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;el el StackOverflowException no se puede capturar en un bloque try&amp;hellip;catch, y como consecuencia, el proceso finaliza sin m&amp;aacute;s, sin hacer preguntas.&lt;/p&gt;
&lt;p&gt;Esto, en una aplicaci&amp;oacute;n de escritorio, aunque es problem&amp;aacute;tico, no tiene mayor repercusi&amp;oacute;n, y el fallo es evidente; La aplicaci&amp;oacute;n se cierra sin hacer preguntas. Pero en una aplicaci&amp;oacute;n Asp.net, el proceso del IIS se reinicia, y hasta que te das cuenta del fallo&amp;hellip; puede pasar mucho tiempo. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx" href="http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=190189" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/snippets/default.aspx">snippets</category></item><item><title>Top 100 European Software Companies</title><link>http://geeks.ms/blogs/crisfervil/archive/2011/02/07/top-100-european-software-companies.aspx</link><pubDate>Mon, 07 Feb 2011 08:27:22 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:188515</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=188515</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2011/02/07/top-100-european-software-companies.aspx#comments</comments><description>&lt;p&gt;Veo este ranking y me pregunto: ¿Qué nos pasa?&lt;/p&gt;  &lt;p&gt;¿Cómo es posible que entre las 100 mayores empresas europeas sólo haya UNA española?&lt;/p&gt;  &lt;p&gt;¿Qué es lo que ocurre?&lt;/p&gt;  &lt;p&gt;¿Somos poco emprendedores? ¿No tenemos ideas? ¿No sabemos hacer negocio?&lt;/p&gt;  &lt;p&gt;¿El software no es lo nuestro?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.truffle100.com/2010/ranking.php" target="_blank"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="484" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_791D6B9B.png" width="527" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Source: &lt;a title="http://www.truffle100.com/2010/ranking.php" href="http://www.truffle100.com/2010/ranking.php"&gt;http://www.truffle100.com/2010/ranking.php&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;No hay que desmerecer el hecho de que &lt;a href="http://www.pandasecurity.com/" target="_blank"&gt;Panda Software&lt;/a&gt; esté en la posición 45, si no que no haya ninguna otra, ni por encima, ni por debajo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5D367967.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="210" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_43D106DE.png" width="565" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Truffle 100&lt;/strong&gt; ranks &amp;amp; analyzes the top 100 European Software Vendors (ISVs).    &lt;br /&gt;It was created in 2006 by &lt;strong&gt;&lt;a href="http://www.truffle.com"&gt;Truffle Capital&lt;/a&gt;&lt;/strong&gt;, &lt;a href="http://www.truffle.com"&gt;a leading European Venture Capital firm&lt;/a&gt;. The research is based on data compiled from survey and analysis conducted over the years by &lt;a href="http://www.cxp.fr/"&gt;CXP&lt;/a&gt;, a Market Research Organization focusing on Software, &lt;a href="http://www.idc.com"&gt;IDC&lt;/a&gt;, the premier global market intelligence firm, and the &lt;a href="http://www.softwaretop100.org/"&gt;Top 100 Research Foundation&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=188515" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Opinion/default.aspx">Opinion</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx">General</category></item><item><title>Feliz 11111011011</title><link>http://geeks.ms/blogs/crisfervil/archive/2011/01/03/feliz-11111011011.aspx</link><pubDate>Mon, 03 Jan 2011 15:26:51 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:186705</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=186705</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2011/01/03/feliz-11111011011.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4ABCD818.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="213" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_449AACDF.png" width="441" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;2011 es la suma de 11 números primos consecutivos.&lt;/p&gt;  &lt;h2&gt;2011 = 157+163+167+173+179+181+191+193+197+199+211&lt;/h2&gt;  &lt;p&gt;Es el siguiente año correspondiente a un número primo, desde 2003.&lt;/p&gt;  &lt;p&gt;Dos números primos son “consecutivos” si uno sigue al otro en la colección de números primos. Por ejemplo, 3 y 5 son números primos consecutivos, como lo son 7 y 11.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;¿Qué números primos son el resultado de la suma de otros números primos consecutivos?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;He aquí una lista: &lt;a href="http://bit.ly/dKuh9S" target="_blank"&gt;http://bit.ly/dKuh9S&lt;/a&gt; (2011 es uno de ellos!)&lt;/p&gt;  &lt;p&gt;El enlace corresponde a una entrada a la On-Line Encyclopedia of Integer Sequences (OEIS) y lo que se muestra es una lista de ejemplo de números que son el resultado de la sima de dos o más números primos consecutivos.&lt;/p&gt;  &lt;p&gt;Se incluye también código de &lt;a href="http://es.wikipedia.org/wiki/Mathematica" target="_blank"&gt;Mathematica&lt;/a&gt; para encontrar este tipo de números primos.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_47D1B629.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="404" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_08961D3D.png" width="263" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;El problema de encontrar números primos que son suma de dos o más números primos no consecutivos es un problema complejo, que se suele utilizar como ejercicio en muchas universidades.&lt;/p&gt;  &lt;p&gt;Podemos complicarlo un poco más e intentar averiguar, por ejemplo, ¿qué números primos son el resultado de la suma de números primos que son el resultado de la suma de números primos consecutivos…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;El siguiente año, después de 2011 que es resultado de la suma de números primos consecutivos es 2027.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;2027 = 29+31+37+41+43+47+53+59+61+67+71+73+ 79+83+89+97+101+103+107+109+113+127+131+137+139&lt;/p&gt;  &lt;p&gt;2027 tiene además la propiedad de estar formado por los números 2+0+2+7=11, cuya suma es también, un número primo. Es el primer año desde 2003 que tiene esta propiedad.&lt;/p&gt;  &lt;p&gt;El siguiente año, después de 2027 con la propiedad de ser suma de números primos consecutivos es 2081.&lt;/p&gt;  &lt;p&gt;2081 = 401+409+419+421+431&lt;/p&gt;  &lt;p&gt;Pero 2011 puede ser además escrito como suma de otros números primos consecutivos. &lt;/p&gt;  &lt;p&gt;2011 = 661+673+677 &lt;/p&gt;  &lt;p&gt;Esto nos lleva a la pregunta: ¿De cuántas maneras puede expresarse un número primo como suma de números primos consecutivos?&lt;/p&gt;  &lt;p&gt;Pues, eso, feliz 2011!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://en.wikipedia.org/wiki/Prime_number" href="http://en.wikipedia.org/wiki/Prime_number"&gt;http://en.wikipedia.org/wiki/Prime_number&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://en.wikipedia.org/wiki/Primality_test" href="http://en.wikipedia.org/wiki/Primality_test"&gt;http://en.wikipedia.org/wiki/Primality_test&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=186705" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx">General</category></item><item><title>DSL. Domain Specific Languaje.</title><link>http://geeks.ms/blogs/crisfervil/archive/2010/12/22/dsl-domain-specific-languaje.aspx</link><pubDate>Wed, 22 Dec 2010 07:24:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:186248</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=186248</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2010/12/22/dsl-domain-specific-languaje.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_15FB5B4E.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 20px 0px;border-right-width:0px;" height="218" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_02731D0F.png" width="323" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Qué son exactamente los DSL y qué posibilidades nos ofrecen? &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;En su definición más generalista, un DSL [Domain-Specific Programming Languaje] o &amp;quot;Lenguaje de Programación de Dominio Específico&amp;quot; es un lenguaje diseñado para realizar tareas específicas para un dominio concreto; es decir, a diferencia de un lenguaje de uso general, como C# o VB, un DSL permite abstraerse a una tipo de problema concreto, como puede ser, ejecutar procedimientos almacenados. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Si lo que queremos es ejecutar procedimientos almacenados, un lenguaje generalista como VB, C o C#, permitiría realizarlo sin problemas, pero un lenguaje diseñado específicamente para esta actividad, debería hacer el trabajo más fácil. Un DSL, por ser un lenguaje específico, dejaría de lado las funciones que no son necesarias y se centraría sólo en lo importante para realizar dicha actividad.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6E7EABDA.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 20px 0px;border-right-width:0px;" height="228" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_11D0C1E2.png" width="323" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un DSL debe permitir definir las entidades del dominio, que serían las piezas del puzle con las que el programador especificará los detalles concretos del problema.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Un DSL para ejecutar procedimientos almacenados podrían tener los siguientes elementos de dominio: Base de Datos, Procedimiento Almacenado, Esquema, Paquete, Parámetro, Cursor de Salida, Campo, etc., etc..&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;El lenguaje nos debería permitir definir las propiedades y la interrelación entre estos elementos de dominio, y con esa información, permitir realizar la operación deseada.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image44_5F00_7073ACF6.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 20px 0px;border-right-width:0px;" height="209" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image44_5F00_thumb_5F00_774DF27F.png" width="327" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un DSL no tiene porqué ser un lenguaje de programación escrito, que haya que teclear. Puede ser gráfico, permitiendo definir las relaciones entre sus elementos mediante un lenguaje Visual. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ejemplos de Lenguajes Específicos pueden ser: Logo para niños, Verilog y VHSIC, R y S para estadísticas, Mata para programación matricial, Mathematica y Maxima para matemáticas, fórmulas de hojas de cálculo y macros, SQL para consultas a bases de datos relacionales, Yacc para crear parseadores, expresiones regulares para crear análisis léxico, Generic Eclipse Modeling System y &lt;a href="http://en.wikipedia.org/wiki/DGML" target="_blank"&gt;DGML de Visual Studio&lt;/a&gt; para crear lenguajes con el objetivo de diagramar, Csound un lenguaje para síntesis digital, y los lenguajes de entrada de GraphViz y GrGen, paquetes de software usados para graficar y reescribir gráficas. También podrían serlo &lt;a href="http://geeks.ms/blogs/crisfervil/archive/2010/11/30/alice-mundos-virtuales-y-programacion.aspx" target="_blank"&gt;Alice, un lenguaje para la programación de mundos virtuales&lt;/a&gt; y &lt;a href="http://www.antlr.org/" target="_blank"&gt;ANTLR, que permite definir compiladores&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2A42A449.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="242" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_08E8200F.png" width="328" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pasando un poco de las definiciones más generalistas, vamos a ver qué son las DSL dentro de Visual Studio. &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;br /&gt;Dentro del SDK de Visual Studio (a partir de la versión 2005), se encuentran las DSL Tools, que permiten la definición de los elementos de la DSL, la creación de diseñadores gráficos y la generación automática de código usando una notación bastante sencilla, basada en plantillas, que pueden ser escritas en C# o en VB.net. &lt;/p&gt;  &lt;p&gt;Está bien, parece interesante, pero cómo se hace esto? &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/blogs/crisfervil/archive/2010/12/22/dsl-con-visual-studio.aspx" target="_blank"&gt;El ejemplo en la siguiente entrega&lt;/a&gt; ;)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Fuentes:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/bb126259.aspx" href="http://msdn.microsoft.com/en-us/library/bb126259.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb126259.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/vstudio/cc677260.aspx" href="http://msdn.microsoft.com/en-us/vstudio/cc677260.aspx"&gt;http://msdn.microsoft.com/en-us/vstudio/cc677260.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://en.wikipedia.org/wiki/Domain-specific_language" href="http://en.wikipedia.org/wiki/Domain-specific_language"&gt;http://en.wikipedia.org/wiki/Domain-specific_language&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://cuartageneracion.blogspot.com/2005/06/microsoft-y-mda-mdd-domain-specific.html" href="http://cuartageneracion.blogspot.com/2005/06/microsoft-y-mda-mdd-domain-specific.html"&gt;http://cuartageneracion.blogspot.com/2005/06/microsoft-y-mda-mdd-domain-specific.html&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=186248" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/DSL/default.aspx">DSL</category></item><item><title>DSL Con Visual Studio</title><link>http://geeks.ms/blogs/crisfervil/archive/2010/12/22/dsl-con-visual-studio.aspx</link><pubDate>Wed, 22 Dec 2010 07:04:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:186247</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=186247</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2010/12/22/dsl-con-visual-studio.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Dentro del SDK de Visual Studio (a partir de la versión 2005), se encuentran las DSL Tools, que permiten la definición de los elementos de la DSL, la creación de diseñadores gráficos y la generación automática de código usando una notación bastante sencilla, basada en plantillas, que pueden ser escritas en C# o en VB.net. &lt;/p&gt;  &lt;p&gt;Está bien, parece interesante, pero cómo se hace esto? &lt;/p&gt;  &lt;p&gt;Lo primero, es la instalación del &lt;a href="http://msdn.microsoft.com/en-us/library/bb166441.aspx" target="_blank"&gt;SDK&lt;/a&gt; de la versión correspondiente a Visual Studio que tienes instalada. &lt;/p&gt;  &lt;p&gt;Para crear un DSL debemos crear un proyecto de tipo Doman-Specific Languaje Designer&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_73099A39.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="499" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_6C7B3C0B.png" width="685" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Al crear la solución, se mostrará un asistente que nos guiará en la creación del proyecto. Existen plantillas, que contienen elementos del dominio y diseñadores predefinidos, en las que podemos basar nuestro DSL.&amp;#160; &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Los posteriores pasos del asistente son triviales. Piden información acerca del nombre del proyecto, la compañía, etc. &lt;/p&gt;  &lt;p&gt;Para el ejemplo, seleccionaremos la plantilla MinimalLanguaje.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_600FA993.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="487" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_7CAEB617.png" width="700" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_449259A3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="487" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_7C69BF28.png" width="700" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Finalizado el asistente, se crean en la solución, dos proyectos: &lt;span style="font-style:italic;"&gt;Dsl &lt;/span&gt;y &lt;span style="font-style:italic;"&gt;DslPackage&lt;/span&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_66A4F82D.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="379" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_212288B3.png" width="350" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Dentro de la solución, en el proyecto DSL encontraremos estos elementos:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_26FFBCFD.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="635" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3E0D7C92.png" width="986" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Al archivo DslDefinition, en el que definiremos todas las piezas de nuestro puzle.&lt;/p&gt;  &lt;p&gt;El panel DslExplorer, que nos mostrará, de una manera organizada, los elementos, y la lógica que definirá el comportamiento de nuestro Dsl.&lt;/p&gt;  &lt;p&gt;El panel DSL Details, que nos informará de algunas propiedades del elemento DSL seleccionado en diseñador DSL.&lt;/p&gt;  &lt;p&gt;La Toolbox, en la que encontraremos los elementos que podemos arrastrar al diseñador.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1593BBE0.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="301" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_62C6461C.png" width="197" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Una cosa realmente curiosa, es que la herramienta que estamos utilizando para crear nuestro DSL, es decir el &amp;quot;DSL Designer&amp;quot; de Visual Studio es un DSL, es decir, un lenguaje visual a partir del cual crearemos en un lenguaje no específico, la solución a nuestro problema especifico. Simplemente, impresionante. &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_28D993E1.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="486" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_03723124.png" width="189" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Como siguientes pasos para la demo, realizar las siguientes acciones:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Eliminar los elementos: ExampleElement, ExampleShape y ExampleConnector&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir, desde la Toolbox un &lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin-left:0px;margin-right:0px;border-right-width:0px;" height="21" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5038886B.png" width="138" border="0" /&gt; y llamarlo StoredProcedure&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir otro Named Domain Class y llamarlo Parameter&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir otro Named Domain Class y llamarlo Resulset&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir otro Named Domain Class y llamarlo Field    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_16B57874.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="484" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_37CB05BF.png" width="323" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A continuación, los siguientes pasos:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Conectar ExampleModel con StoredProcedure mediante un &lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_494087F9.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="16" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3DAACABA.png" width="141" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Conectar StoredProcedure con Resulset mediante un Embedding RelationShip&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Conectar StoredProcedure con Parameter mediante un Embedding RelationShip    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Conectar Resulset con Field mediante un Embedding RelationShip&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_32150D7B.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="555" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_6D8D1E8E.png" width="297" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A continuación, más pasos:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir un &lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="20" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_061F4C90.png" width="127" border="0" /&gt; y llamarlo StoredProcedureCompartmentShape.&lt;/p&gt;  &lt;p&gt;Botón derecho sobre Decorators y Add new Text Decorator.&lt;/p&gt;  &lt;p&gt;Botón derecho sobre Compartments y Add new Compartment.&lt;/p&gt;  &lt;p&gt;Editar las propiedades de Compartment1 y establecer la propiedad Title a “Parameters”.&lt;/p&gt;  &lt;p&gt;Conectar StoredProcedure con StoredProcedureCompartmentShape mediante un Diagram Element Map.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir un CompartmentShape y llamarlo ResulsetCompartmentShape.&lt;/p&gt;  &lt;p&gt;Botón derecho sobre Decorators y Add new Text Decorator.&lt;/p&gt;  &lt;p&gt;Botón derecho sobre Compartments y Add new Compartment.&lt;/p&gt;  &lt;p&gt;Editar las propiedades de Compartment1 y establecer la propiedad Title a “Fields”.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir un &lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="14" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4172B24E.png" width="74" border="0" /&gt; y unirlo mediante un &lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="18" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_61218C16.png" width="130" border="0" /&gt;&amp;#160; con la relación que hay entre StoredProcedure y Resulset, es decir, StoredProcedureHasResulset.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Doble Click en la Línea que une&amp;#160; El StoredProcedureCompartmentShape y el StoredProcedure.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6A111E55.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="174" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3DF6B215.png" width="638" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;En la pestaña DSL Details, seleccionar, la pestaña Decorator Maps y en Decorators, marcar el check TextDecorator1.&lt;/p&gt;  &lt;p&gt;En el drop Display Property que aparece más a la derecha, seleccionar la propiedad Name.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1652C69C.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="174" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_72BBB9A5.png" width="659" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A continuación, cambiar a la pestaña Compartment Maps.&lt;/p&gt;  &lt;p&gt;Seleccionar el check Compartment1 y en el TextBox de la derecha “Displayed elements collection path:” escribir:&lt;/p&gt;  &lt;p&gt;StoredProcedureHasParameters.Parameters/!Parameter&lt;/p&gt;  &lt;p&gt;En el drop “Display property:” seleccionar la propiedad Name.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Luego, exactamente lo mismo para la Línea que une&amp;#160; El ResulsetCompartmentShape y el StoredProcedure.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_0D8A7063.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="178" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_438EEF70.png" width="481" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_49D856AF.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="181" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_542E9C71.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;En la pestaña Compartment Maps, el texto de “Displayed elements collection path:” debe ser:&lt;/p&gt;  &lt;p&gt;ResulsetHasFields.Fields/!Field&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_60BEDA3E.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="438" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_4E0C7138.png" width="343" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Finalmente, en el panel DSL Explorer, en el nodo SPDSL (Dsl)\Editor\Toolbox Tabs\SPDSL\Tools&lt;/p&gt;  &lt;p&gt;Eliminar ExampleElement y ExampleRelationShip&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A continuación, click con el botón derecho sobre SPDSL \ Add new Element Tool&lt;/p&gt;  &lt;p&gt;Editar las propiedades del nuevo nodo:&lt;/p&gt;  &lt;p&gt;Class = StoredProcedure&lt;/p&gt;  &lt;p&gt;Name = StoredProcedureTool&lt;/p&gt;  &lt;p&gt;Toolbox Icon = Seleccionar un icono. (Se pueden agregar más iconos añadiendo imágenes a la carpeta Resources del proyecto en el Solution Explorer)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1AD2C880.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="443" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_55505905.png" width="297" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Nuevamente, en el DSL Explorer, botón derecho sobre SPDSL, Add new Connection Builder.&lt;/p&gt;  &lt;p&gt;Luego, botón derecho sobre el nuevo nodo, Add new Connection Builder Directive&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4231BD0A.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="128" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_7F55788F.png" width="272" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Seleccionar el nuevo nodo, y en el panel DSL Details…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2EA6EE1A.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="164" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_15417B91.png" width="458" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Seleccionar en RelationShip la relación StoredProcedureHasResulset&lt;/p&gt;  &lt;p&gt;En Source role directives, seleccionar StoredProcedure y en Target role directives, seleccionar Resulset.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Y ya por último, nuevamente en el DSL Explorer…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2DD3A992.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="495" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1A48DAA2.png" width="381" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Botón derecho en SPDSL, Add new Connection Tool.&lt;/p&gt;  &lt;p&gt;Editar las propiedades del nuevo nodo, y establecer el Connection Builder, el Name y el Tool Box Icon.&lt;/p&gt;  &lt;p&gt;Ya ya, guardar todo,&amp;#160; click en el botón Transform All Templates del Solution Explorer y F5&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_593CEBEE.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="111" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_4B0103AF.png" width="279" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Si todo ha ido bien, el resultado debe ser este:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image91_5F00_2AE887A3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="660" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image91_5F00_thumb_5F00_7DF5B578.png" width="925" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Y la definición del DSL debe quedar así:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_42C98BC0.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="744" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_28221109.png" width="789" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;To be continued. &lt;/p&gt;  &lt;p&gt;En la siguiente entrega, intentaré mostrar como agregar propiedades a los elementos del dominio, y hacer que las cajitas del diagrama sean más bonitas. Pero vamos, visto esto, todo lo que viene a continuación es muy sencillo.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cid-da2e56199efa5596.office.live.com/self.aspx/BlogAttachments/SPDSL.zip" target="_blank"&gt;Decargar el código&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=186247" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/DSL/default.aspx">DSL</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>SQL DSL</title><link>http://geeks.ms/blogs/crisfervil/archive/2010/12/10/sql-dsl.aspx</link><pubDate>Fri, 10 Dec 2010 10:39:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:185823</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=185823</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2010/12/10/sql-dsl.aspx#comments</comments><description>&lt;p&gt;Esta DSL permite generar consultas SQL a partir de la definición de unas tablas y sus relaciones.&lt;/p&gt;  &lt;p&gt;La he desarrollado sobre Visual Studio 2005, pero como todo es muy básico, supongo que aplica a versiones posteriores.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_0A689EB2.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="484" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_55834B87.png" width="635" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Este es el aspecto de la DSL&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_140DBA90.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="299" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_73F53E83.png" width="380" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Así es como quedaría la Query generada.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;&lt;strong&gt;Los elementos del modelo&lt;/strong&gt;&lt;/h2&gt;  &lt;h3&gt;Las clases&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1FAC93A6.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="113" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1D0668A6.png" width="170" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_375FD097.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="128" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_49AB280A.png" width="352" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Representa una Query. Un diagrama puede tener una 0..N Queries.    &lt;br /&gt;Permitimos especificar un nombre y una descripción. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_42950769.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="108" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1D2B13FB.png" width="164" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1FCAB3D5.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="121" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3620591A.png" width="353" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Representa cada una de las Tablas que tendrá la Consulta.    &lt;br /&gt;Tiene la propiedad Alias por si es necesario darle otro nombre a la tabla.     &lt;br /&gt;Una Query puede tener 0..N Tablas&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_0A0F08B1.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="156" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_0B732B83.png" width="165" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1A7E5DD5.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="174" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_29B4C6A2.png" width="352" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Representa cada uno de los campos de una Tabla.    &lt;br /&gt;Cada tabla puede tener 0..N Campos.     &lt;br /&gt;La propiedad Name y Alias permite referenciar el nombre del campo.     &lt;br /&gt;La propiedad Select indica si el campo debe aparecer en la cláusula SELECT de la Query. Si es false, se utilizará sólo para especificar una condición.&amp;#160; &lt;br /&gt;Las condiciones de filtrado de la Query se especificarán en la propiedad FilterValue. En la imagen de ejemplo, se añadirá al WHERE de la SELECT la condición SHIP_COUNTRY=’SPAIN”. La propiedad DataType se utilizará para formatear adecuadamente el valor de la condición. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Las Relaciones&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_451AE6CF.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="85" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_302BF50D.png" width="260" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;El modelo sólo podrá tener una Query como elemento primario.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1FB38412.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="87" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2FC252C9.png" width="230" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;La Query podrá tener una o varias Tablas.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_3845B213.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="88" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_5A311497.png" width="248" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;y cada Tabla tendrá sus Campos.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_578AE997.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="118" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_49BB344D.png" width="312" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4966311B.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="120" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_26A4F95E.png" width="352" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Por último, las Tablas podrán tener relaciones entre ellas, y en cada relación, deben especificar un campo en cada tabla, mediante el cual se pueden relacionar.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Los elementos UI&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2F13B996.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="121" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_254E521E.png" width="192" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6AE7F15B.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="122" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_67696071.png" width="180" border="0" /&gt;&lt;/a&gt; &lt;/h3&gt;  &lt;p&gt;Es una GeometryShape normal y corriente. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_730F29F3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="156" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2C2897A7.png" width="211" border="0" /&gt;&lt;/a&gt; &lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_3035762A.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="74" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_64699F70.png" width="201" border="0" /&gt;&lt;/a&gt; &lt;/h3&gt;  &lt;p&gt;Hemos modificado este CompartmentShape indicando que tendrá un Custom Parent Element, para que mediante código podamos especificarle que su padre será el GeometryShape de la clase Query. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_71CFB276.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="132" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_680A4AFE.png" width="169" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7B18DAB6.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="93" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3914FC26.png" width="150" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;El conector tiene un par de Text Decorators para mostrar el Source y el Target Field de cada Tabla.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Customizations&lt;/h3&gt;  &lt;p&gt;Por defecto, en VS 2005 no se permite que un elemento del diagrama tenga como padre a otro elemento que no sea el propio diagrama.    &lt;br /&gt;El truco, es indicar en las propiedades del elemento hijo (el TableCompartmentShape en este caso) que vamos a especificar por código cuál será su padre.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_40D2927A.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="153" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_67370676.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Y en el código, le decimos que su padre será la clase Query.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1F40C5F7.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="132" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_09E831F1.png" width="778" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Template&lt;/h3&gt;  &lt;p&gt;En la Template, todo el código es bastante simple. En la mayor parte se trata de recorrer los elementos del diagrama, para ir creando la Query.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7FEDDFCC.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="206" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_11CD044B.png" width="443" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Recorrer las Queries del Modelo&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5CC305CB.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="227" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_19E6C151.png" width="391" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Recorrer las Tablas de cada Query y por cada Tabla, recorrer cada Columna&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Quizá lo más complejo es lo de leer las propiedades de la relación.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_49487632.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="268" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3A342809.png" width="935" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;font color="#008080"&gt;TableReferencesTargetTables&lt;/font&gt; es la clase que representa la relación entre las tablas. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_578AE997.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="118" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_49BB344D.png" width="312" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Esta clase expone el método estático GetLinksToSourceTables que devuelve las relaciones en las que la tabla especificada en el parámetro sea Origen, o tenga el rol “source”. Una vez que tengamos esta referencia, podemos leer el valor de las propiedades Source y Target, que son los campos por los que se relacionan las dos tablas.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Y para qué puede servir todo esto? Pues para además de generar la query, generar por ejemplo los procedimientos almacenados para las operaciones de Alta, Baja, Consulta y Modificación (CRUD), la capa de Acceso a Datos, incluso parte de la Lógica de negocio, Unit Tests, puede que hasta formularios. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://hrfqrq.blu.livefilestore.com/y1pa-hL-Yd1-WIQKuNwwePRYLNP3uFVvsS49bcqt3ChQJ9owt_JOt2uPvS6S5lbBN4zzMLbUIAtIMhn1nU3XzR8iI6g-XmESwPk/QueryDSL.zip?download&amp;amp;psid=1" target="_blank"&gt;Adjunto él código&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185823" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/dotNetFramework/default.aspx">dotNetFramework</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/snippets/default.aspx">snippets</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/DSL/default.aspx">DSL</category></item><item><title>Alice. Mundos virtuales y programacion</title><link>http://geeks.ms/blogs/crisfervil/archive/2010/11/30/alice-mundos-virtuales-y-programacion.aspx</link><pubDate>Tue, 30 Nov 2010 18:20:29 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:185430</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=185430</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2010/11/30/alice-mundos-virtuales-y-programacion.aspx#comments</comments><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/images/0307392260/ref=dp_image_0?ie=UTF8&amp;amp;n=283155&amp;amp;s=books"&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" border="0" alt="La última lección + DVD (Spanish Edition)" align="left" src="http://ecx.images-amazon.com/images/I/51qhac4oXTL._SL500_AA300_.jpg" width="300" height="300" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hace un tiempo leí este libro que me recomendaron. &lt;/p&gt;  &lt;p&gt;La &lt;a href="http://es.wikipedia.org/wiki/La_%C3%BAltima_lecci%C3%B3n" target="_blank"&gt;última lección&lt;/a&gt; es un libro autobiográfico escrito por &lt;a href="http://es.wikipedia.org/wiki/Randy_Pausch" target="_blank"&gt;Randy Pausch&lt;/a&gt;, profesor de informática, diseño e interacción persona-ordenador en la Universidad Carnegie Mellon en Pittsburgh, Pennsylvania, Estados Unidos. &lt;/p&gt;  &lt;p&gt;El libro profundiza en los temas expuestos en su famosa conferencia “Really Achieving Your Childhood Dreams” (realizando de verdad tus sueños de la infancia) .&lt;/p&gt;  &lt;p&gt;La obra gira en torno a sus pensamientos sobre la informática, la colaboración interdisciplinar, la educación, la interacción personal y el sentido de la vida.&lt;/p&gt;  &lt;p&gt;A mi me supo como una bocanada de optimismo. Es un libro muy recomendable.&lt;/p&gt;  &lt;p&gt;En varias ocasiones, el autor menciona su trabajo en la universidad. Entre otras cosas es creador del programa &lt;a href="http://es.wikipedia.org/wiki/Alice_(programa)" target="_blank"&gt;Alice&lt;/a&gt;, un lenguaje de programación visual que permite crear mundos virtuales.&lt;/p&gt;  &lt;p&gt;El programa, creado en Java, está pensado para enseñar a programar.&lt;/p&gt;  &lt;p&gt;Es una aplicación muy intuituva, y la verdad es que me encantó. Me gustó mucho la idea de poder programar arrastrando y soltando. Nunca había probado un programa de este tipo.&lt;/p&gt;  &lt;p&gt;Así que nada, me puse manos a la obra, y aprovechando que es “para enseñar a programar” intenté enseñar a mi hija de 6 años.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1B87A29F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_4AE5EB9E.png" width="805" height="551" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_37B49925.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_4E1711DF.png" width="474" height="303" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Como curiosidad, el programa está financiado en parte por Microsoft &lt;strike&gt;(aunque sea Java)&lt;/strike&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1604F82F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_01CB900C.png" width="527" height="439" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Este es el resultado del mundo virtual. Las voces de doblaje son las de mis peques =)&lt;/p&gt;  &lt;p&gt;Son 14 segundos de trepidante animación animal.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:717d8763-98bf-46d9-a948-76872f23664e" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=xMT2_GuBNlk" target="_new"&gt;&lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/videodd61676e8d85_5F00_4B1D992D.jpg" style="border-style:none;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185430" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx">General</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/Java/default.aspx">Java</category></item><item><title>Cuentas de Correo de tu ISP</title><link>http://geeks.ms/blogs/crisfervil/archive/2010/11/25/cuentas-de-correo-de-tu-isp.aspx</link><pubDate>Thu, 25 Nov 2010 18:28:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:185262</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=185262</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2010/11/25/cuentas-de-correo-de-tu-isp.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_07EA6C9D.png" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_71D3DB3D.png" width="644" height="390" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Existe alguien en el universo que siga utilizando las cuentas de correo que te “regala” el ISP?&lt;/p&gt;  &lt;p&gt;Teniendo HotMail, GMail, los Spaces, los Google Sites, hacen falta?&lt;/p&gt;  &lt;p&gt;Y encima te dicen que son de 1 GB!! como si fuera gran cosa!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185262" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx">General</category></item><item><title>Ejemplo CodeRun</title><link>http://geeks.ms/blogs/crisfervil/archive/2010/11/24/ejemplo-coderun.aspx</link><pubDate>Wed, 24 Nov 2010 07:47:17 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:185201</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=185201</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2010/11/24/ejemplo-coderun.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://coderun.com/" target="_blank"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="54" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_65807FA6.png" width="166" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Esto es a lo que yo llamo programar en la nube.&lt;/p&gt;  &lt;p&gt;CodeRun es un IDE de .net desarrollado íntegramente en la nube. Con sus proyectos, su editor en colorines, su autocomplete, su depurador, su compilador y todo.&lt;/p&gt;  &lt;p&gt;Permite compartir código, así que pongo un proyecto de ejemplo. &lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.coderun.com/ide/?w=cjw_XNFQyUiZcJjZCKpHVw" href="http://www.coderun.com/ide/?w=cjw_XNFQyUiZcJjZCKpHVw" target="_blank"&gt;http://www.coderun.com/ide/?w=cjw_XNFQyUiZcJjZCKpHVw&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;El ejemplo muestra cómo añadir un Handler de Javascript para el evento click de cada uno de los items de un control RadioButtonList&amp;#160; de asp.net, cuando está enlazado a datos.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6E03DEF0.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="194" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_549E6C67.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vista de la ventana de proyectos&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_684DE6AC.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="399" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2602807C.png" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vista del editor de código aspx&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2D466849.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="364" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_50987E50.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vista del editor de c#&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2095DEE2.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="228" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_06C43964.png" width="600" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vista del “intellisense”&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1F566765.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="388" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2E232DEE.png" width="538" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vista de la ventana para añadir nuevos proyectos. &lt;/p&gt;  &lt;p&gt;Existen varias plantillas de proyecto, para MVC, YUI, JQuery, etc, etc, etc. Incluso se pueden realizar proyectos en PHP.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://hrfqrq.blu.livefilestore.com/y1pxpkgeHdwAgsjVmJNGttuEzlsk92HJ4XjaKp2jyA-jt0I1-AO7tE_FGUiFg4scf6_Rzkv7omlxA6sot6yp9sW-aZol9l-t19I/RadioButtonListItemOnClientClick.zip?download&amp;amp;psid=1" target="_blank"&gt;Descargar el código de ejemplo&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185201" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/dotNetFramework/default.aspx">dotNetFramework</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx">General</category><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/asp.net/default.aspx">asp.net</category></item><item><title>CERN CMS Fireworks</title><link>http://geeks.ms/blogs/crisfervil/archive/2009/11/24/cern-cms-fireworks.aspx</link><pubDate>Tue, 24 Nov 2009 21:47:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:161185</guid><dc:creator>Cristhian Fernández</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/crisfervil/rsscomments.aspx?PostID=161185</wfw:commentRss><comments>http://geeks.ms/blogs/crisfervil/archive/2009/11/24/cern-cms-fireworks.aspx#comments</comments><description>&lt;p&gt;He visto unas capturas de pantalla de la aplicaci&amp;oacute;n que usan para analizar los datos que genera el &lt;a target="_blank" href="http://es.wikipedia.org/wiki/Gran_colisionador_de_hadrones"&gt;Colisionador de Hadrones&lt;/a&gt; del &lt;a target="_blank" href="http://public.web.cern.ch/public/en/LHC/LHC-en.html"&gt;CERN&lt;/a&gt; y me ha llamado la atenci&amp;oacute;n lo espectacular de la interface&amp;hellip; as&amp;iacute; que he investigado un poco&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/R121995L6E181_5F00_54A1979A.png"&gt;&lt;img height="484" width="634" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/R121995L6E181_5F00_thumb_5F00_413C8162.png" alt="R121995-L6-E18[1]" border="0" title="R121995-L6-E18[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Parece una aplicaci&amp;oacute;n en Java, o C++ , sobre Linux&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/HaloHCAL1136861_5F00_34DA7007.jpg"&gt;&lt;img height="389" width="645" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/HaloHCAL1136861_5F00_thumb_5F00_672E1DB9.jpg" alt="Halo-HCAL-113686[1]" border="0" title="Halo-HCAL-113686[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;No est&amp;aacute; mal eh!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/CollisionEvent1_5F00_1FC8A1FA.png"&gt;&lt;img height="493" width="645" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/CollisionEvent1_5F00_thumb_5F00_5A6FFF36.png" alt="CollisionEvent[1]" border="0" title="CollisionEvent[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Aunque pone FireWorks, creo que no tiene nada que ver con el &lt;span style="text-decoration:line-through;"&gt;Macromedia&lt;/span&gt; &lt;a target="_blank" href="http://www.adobe.com/products/fireworks/"&gt;Adobe Fireworks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tutorial de la aplicaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twiki.cern.ch/twiki/bin/view/CMS/WorkBookFireworksTutorial" title="https://twiki.cern.ch/twiki/bin/view/CMS/WorkBookFireworksTutorial"&gt;https://twiki.cern.ch/twiki/bin/view/CMS/WorkBookFireworksTutorial&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;V&amp;iacute;deo de demostraci&amp;oacute;n de la aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cms-service-sdtweb.web.cern.ch/cms-service-sdtweb/fireworks/demo.mov" title="http://cms-service-sdtweb.web.cern.ch/cms-service-sdtweb/fireworks/demo.mov"&gt;http://cms-service-sdtweb.web.cern.ch/cms-service-sdtweb/fireworks/demo.mov&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En el video parece que responde bastante bien. &lt;/p&gt;
&lt;p&gt;La habr&amp;aacute;n hecho en la India? en China? cu&amp;aacute;ndo han podido tardar en hacer algo as&amp;iacute;? cu&amp;aacute;nto debi&amp;oacute; costar? &lt;/p&gt;
&lt;p&gt;El LHC comenz&amp;oacute; a construirse sobre el antiguo t&amp;uacute;nel del &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Large_Electron%E2%80%93Positron_Collider"&gt;LEP&lt;/a&gt;, en el a&amp;ntilde;o 2000, y al parecer tendr&amp;aacute; un coste total de 3,7 Billones (con B) de Euros!!&amp;nbsp; Desde luego no podr&amp;aacute;n decir que no han tenido tiempo y presupuesto..&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cms.web.cern.ch/cms/News/e-commentary/cms-e-commentary09.htm" title="http://cms.web.cern.ch/cms/News/e-commentary/cms-e-commentary09.htm"&gt;http://cms.web.cern.ch/cms/News/e-commentary/cms-e-commentary09.htm&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161185" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx">General</category></item></channel></rss>