{"id":23870140,"url":"https://github.com/perez987/html-from-xml-with-xsl","last_synced_at":"2026-02-28T14:31:48.755Z","repository":{"id":122534839,"uuid":"440969413","full_name":"perez987/HTML-from-XML-with-XSL","owner":"perez987","description":"Convert an XML document to an HTML document with formatting and layout defined in an XSL style sheet with Visual Studio 2019 (VB)","archived":false,"fork":false,"pushed_at":"2023-02-16T23:24:27.000Z","size":10133,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-09T20:06:11.402Z","etag":null,"topics":["html","visualbasic","xml","xsl","xslcompiledtransform","xslt"],"latest_commit_sha":null,"homepage":"","language":"Visual Basic .NET","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/perez987.png","metadata":{"files":{"readme":"README-ES.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-22T19:54:41.000Z","updated_at":"2025-10-07T18:42:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"83aa5892-584d-4575-b111-7b2ce096e853","html_url":"https://github.com/perez987/HTML-from-XML-with-XSL","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/perez987/HTML-from-XML-with-XSL","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perez987%2FHTML-from-XML-with-XSL","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perez987%2FHTML-from-XML-with-XSL/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perez987%2FHTML-from-XML-with-XSL/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perez987%2FHTML-from-XML-with-XSL/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/perez987","download_url":"https://codeload.github.com/perez987/HTML-from-XML-with-XSL/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perez987%2FHTML-from-XML-with-XSL/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29937391,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-28T13:49:17.081Z","status":"ssl_error","status_checked_at":"2026-02-28T13:48:50.396Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["html","visualbasic","xml","xsl","xslcompiledtransform","xslt"],"created_at":"2025-01-03T13:52:50.304Z","updated_at":"2026-02-28T14:31:48.744Z","avatar_url":"https://github.com/perez987.png","language":"Visual Basic .NET","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Transformación XML + XSL \u003e\u003e HTML, en Visual Studio 2017\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003ctd align=center\u003e\u003cimg src=img/xml.png\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003cimg src=img/xsl.png\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003cb\u003eConvertir un documento XML en un documento HTML con formato y diseño definidos en una hoja de estilos XSL, utilizando Visual Studio 2017 y lenguaje Visual Basic .NET\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### [Versión en inglés](README.md)\n\n### Introducción\n\nLos documentos XML son de texto plano y su presentación básica carece de opciones de diseño o formato. Al abrirlo siempre vemos texto estructurado de acuerdo con las normas del lenguaje XML. En ocasiones se necesita utilizar datos XML como origen pero presentarlos de una manera determinada, por ejemplo para un dispositivo móvil o para la web. En estos casos podemos recurrir a las hojas de estilo XSL.\n\nXSL (_extensible stylesheet language_) contiene las reglas que permiten extraer y formatear la información desde un archivo XML para ser presentada al usuario. Dentro del lenguaje XSL existe XSLT (_XSL transformation_) que se usa para transformar documentos XML. Mediante XSLT se define cómo va a ser convertido un documento XML en otro tipo de documento que puede ser de varios tipos (PDF, HTML, JAVA, etc.) aunque lo más habitual es que sea HTML para poder ser visualizado en un navegador Web.\nPara conseguirlo hay que relacionar el documento XML con una hoja de estilos XSL en la que se detallan las reglas para transformar un tipo de documento en otro, estas reglas son analizadas por el procesador XSL y la salida resultante es un documento HTML formateado con arreglo a esas reglas.\nEn este ejercicio se ha creado una hoja de estilos XSL en la que se ha definido cómo presentar el origen de datos XML en una página Web apta para ser imprimida por el usuario.\n\n### Clase XslCompiledTransform del espacio de nombres System.Xml.Xsl\n\nEn esta clase disponemos de 2 métodos sobrecargados, XslCompiledTransform.Load y XslCompiledTransform.Transform, que funcionan de esta manera:\n\n* `Load` carga y compila la hoja de estilos que va a ser utilizada usando el documento XSL como parámetro único\n* `Transform` ejecuta la transformación usando el documento XML (parámetro 1) y creando el documento HTML (parámetro 2).\n\n```vbnet\nDim xslt As System.Xml.Xsl.XslCompiledTransform = New XslCompiledTransform\nxslt.Load(Rutaxslt) 'carga y compila la hoja de estilos XSL'\nxslt.Transform(Rutaxmlt, Rutahtml)\n'ejecuta la transformación usando el documento XML del parámetro 1 creando el documento HTML del parámetro 2\n```\n\nEn este ejercicio se van a utilizar 2 documentos: _12empresas.xml_ y _12empresas.xsl_ para obtener por código un tercer documento _12empresas.html_.\n\n### 12empresas.xml\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cAgenda\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e1\u003c/Id\u003e\n    \u003cNombre\u003eCase Corp.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e923659854\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e169852985\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e2\u003c/Id\u003e\n    \u003cNombre\u003eData General Corp.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e902365458\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e223697120\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e3\u003c/Id\u003e\n    \u003cNombre\u003eEastman Kodak Co.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e933696369\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e258623589\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e4\u003c/Id\u003e\n    \u003cNombre\u003eEaton Corp.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e965235898\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e001544444\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e5\u003c/Id\u003e\n    \u003cNombre\u003eGateway Inc.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e900326596\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e001544444\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e6\u003c/Id\u003e\n    \u003cNombre\u003ePaine Webber Group Inc.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e932145785\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e214585258\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e7\u003c/Id\u003e\n    \u003cNombre\u003eParker Hannifin Corp.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e944444102\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e224465668\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e8\u003c/Id\u003e\n    \u003cNombre\u003eReynolds Metals Co.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e923659854\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e221995416\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e9\u003c/Id\u003e\n    \u003cNombre\u003eTenet Healthcare Corp.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e944444102\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e258623589\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e10\u003c/Id\u003e\n    \u003cNombre\u003eUniGroup Inc.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e932665447\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e155584598\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e11\u003c/Id\u003e\n    \u003cNombre\u003eUnion Pacific Resources Group Inc.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e965235898\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e002587455\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n  \u003cContactos\u003e\n    \u003cId\u003e12\u003c/Id\u003e\n    \u003cNombre\u003eXerox Corp.\u003c/Nombre\u003e\n    \u003cTelefono1\u003e932569857\u003c/Telefono1\u003e\n    \u003cTelefono2\u003e224465668\u003c/Telefono2\u003e\n  \u003c/Contactos\u003e\n\u003c/Agenda\u003e\n```\n\n### 12empresas.xsl\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n\u003cxsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\"\u003e\n  \u003cxsl:template match=\"/\"\u003e\n    \u003chead\u003e\n      \u003ctitle\u003eArchivo XML - \u003e documento HTML\u003c/title\u003e\n    \u003c/head\u003e\n    \u003chtml\u003e\n      \u003cbody style=\"font-family: Verdana; font-size: 10pt;\"\u003e\n        \u003cdiv align=\"center\"\u003e\n          \u003ch3\u003e\n            \u003cu\u003eARCHIVO XML - \u003e DOCUMENTO HTML\u003c/u\u003e\n          \u003c/h3\u003e\n          \u003ctable border=\"1\" cellpadding=\"4\" cellspacing=\"4\" style=\"font-family: Verdana; font-size: 10pt;\"\u003e\n            \u003ctr bgcolor=\"lightgrey\"\u003e\n              \u003ctd align=\"left\"\u003e\n                \u003cb\u003e\n                  \u003cfont color=\"black\"\u003eId\u003c/font\u003e\n                \u003c/b\u003e\n              \u003c/td\u003e\n\t\t\t  \u003ctd\u003e\n                \u003cb\u003e\n                  \u003cfont color=\"black\"\u003eNombre de la empresa\u003c/font\u003e\n                \u003c/b\u003e\n              \u003c/td\u003e\n              \u003ctd width=\"100\"\u003e\n                \u003cb\u003e\n                  \u003cfont color=\"black\"\u003eTeléfono\u003c/font\u003e\n                \u003c/b\u003e\n              \u003c/td\u003e\n              \u003ctd width=\"100\"\u003e\n                \u003cb\u003e\n                  \u003cfont color=\"black\"\u003eTeléfono\u003c/font\u003e\n                \u003c/b\u003e\n              \u003c/td\u003e\n            \u003c/tr\u003e\n            \u003cxsl:for-each select=\"Agenda/Contactos\"\u003e\n              \u003cxsl:sort select=\"Nombre\" order=\"ascending\"\u003e\u003c/xsl:sort\u003e\n              \u003ctr bgcolor=\"white\"\u003e\n                \u003ctd align=\"right\"\u003e\n                  \u003cfont color=\"black\"\u003e\n                    \u003cxsl:value-of select=\"Id\"\u003e\u003c/xsl:value-of\u003e\n                  \u003c/font\u003e\n                \u003c/td\u003e\n                \u003ctd\u003e\n                  \u003cfont color=\"black\"\u003e\n                    \u003cxsl:value-of select=\"Nombre\"\u003e\u003c/xsl:value-of\u003e\n                  \u003c/font\u003e\n                \u003c/td\u003e\n                \u003ctd\u003e\n                  \u003cfont color=\"black\"\u003e\n                    \u003cxsl:value-of select=\"Telefono1\"\u003e\u003c/xsl:value-of\u003e\n                  \u003c/font\u003e\n                \u003c/td\u003e\n                \u003ctd\u003e\n                  \u003cfont color=\"black\"\u003e\n                    \u003cxsl:value-of select=\"Telefono2\"\u003e\u003c/xsl:value-of\u003e\n                  \u003c/font\u003e\n                \u003c/td\u003e\n              \u003c/tr\u003e\n            \u003c/xsl:for-each\u003e\n          \u003c/table\u003e\n        \u003c/div\u003e\n      \u003c/body\u003e\n    \u003c/html\u003e\n  \u003c/xsl:template\u003e\n\u003c/xsl:stylesheet\u003e\n```\n### 12empresas.html\n\nSe obtiene el archivo _12empresas.html_ que contiene los mismos datos que el archivo XML pero formateados según el archivo XSL.\n\n![12empresas.html](img/xml_xsl-2.jpg?raw=true)\n\n### Variables con las rutas a los archivos\n\nSe crean unas variables de cadena que obtienen las rutas a los archivos utilizando Server.MapPath que devuelve la ruta física que se corresponde con la ruta virtual especificada.\n\n```vbnet\nPrivate Rutaxmlt As String = Server.MapPath(\"/\") + \"12empresas.xml\"\nPrivate Rutaxslt As String = Server.MapPath(\"/\") + \"12empresas.xsl\"\nPrivate Rutahtml As String = Server.MapPath(\"/\") + \"12empresas.html\"\n```\n\nEstas rutas se podrían obtener de varias maneras diferentes, aquí sólo comento otra que es algo más compleja usando _Combine_ de -FileInfo_ que combina la ruta definida en _Server.MapPath_ con el nombre del archivo.\n\n```vbnet\nPrivate Rutaxmlt As String = New System.IO.FileInfo(System.IO.Path.Combine(Server.MapPath(\"/\"), \"12empresas.xml\")).FullName\nPrivate Rutaxslt As String = New System.IO.FileInfo(System.IO.Path.Combine(Server.MapPath(\"/\"), \"12empresas.xsl\")).FullName\nPrivate Rutahtml As String = New System.IO.FileInfo(System.IO.Path.Combine(Server.MapPath(\"/\"), \"12empresas.html\")).FullName\n```\n\nCon ellas se programa el método que transforma el archivo XML en HTML, lo tienes en el primer bloque de código del articulo.\n\n### Hoja de estilos XSL\n\nObserva que en este archivo se mezclan lenguaje XML y HTML. Por ejemplo, se usan etiquetas y atributos HTML para diseñar la presentación de la página web.\n\n```html\n\u003ctable border=\"1\" cellpadding=\"4\" cellspacing=\"4\" style=\"font-family: Verdana; font-size: 10pt;\"\u003e\n            \u003ctr bgcolor=\"lightgrey\"\u003e\n              \u003ctd align=\"left\"\u003e\n                \u003cb\u003e\n                  \u003cfont color=\"black\"\u003eId\u003c/font\u003e\n                \u003c/b\u003e\n              \u003c/td\u003e\n\t\t\u003ctd\u003e\n                \u003cb\u003e\n                  \u003cfont color=\"black\"\u003eNombre de la empresa\u003c/font\u003e\n                \u003c/b\u003e\n              \u003c/td\u003e\n              \u003ctd width=\"100\"\u003e\n                \u003cb\u003e\n                  \u003cfont color=\"black\"\u003eTeléfono\u003c/font\u003e\n                \u003c/b\u003e\n              \u003c/td\u003e\n              \u003ctd width=\"100\"\u003e\n                \u003cb\u003e\n                  \u003cfont color=\"black\"\u003eTeléfono\u003c/font\u003e\n                \u003c/b\u003e\n              \u003c/td\u003e\n            \u003c/tr\u003e\n```\n\nJunto con lenguaje XML que maneja los datos. Aquí se usan bucles _for-each_ para iterar por los elementos del archivo XML y el comando _sort_ para ordenar los datos. La construcción _\u003cxsl:value-of select=\"Id\"\u003e_ conecta con los valores del elemento del mismo nombre del archivo XML.\n\nJunto con lenguaje XML que maneja los datos. Aquí se usan bucles _for-each_ para iterar por los elementos del archivo XML y el comando _sort_ para ordenar los datos. La construcción _\u003cxsl:value-of select=\"Id\"\u003e_ conecta con los valores del elemento del mismo nombre del archivo XML.\n\n```xml\n        \u003cxsl:for-each select=\"Agenda/Contactos\"\u003e\n              \u003cxsl:sort select=\"Nombre\" order=\"ascending\"\u003e\u003c/xsl:sort\u003e\n              \u003ctr bgcolor=\"white\"\u003e\n                \u003ctd align=\"right\"\u003e\n                  \u003cfont color=\"black\"\u003e\n                    \u003cxsl:value-of select=\"Id\"\u003e\u003c/xsl:value-of\u003e\n                  \u003c/font\u003e\n                \u003c/td\u003e\n                \u003ctd\u003e\n                  \u003cfont color=\"black\"\u003e\n                    \u003cxsl:value-of select=\"Nombre\"\u003e\u003c/xsl:value-of\u003e\n                  \u003c/font\u003e\n                \u003c/td\u003e\n                \u003ctd\u003e\n                  \u003cfont color=\"black\"\u003e\n                    \u003cxsl:value-of select=\"Telefono1\"\u003e\u003c/xsl:value-of\u003e\n                  \u003c/font\u003e\n                \u003c/td\u003e\n                \u003ctd\u003e\n                  \u003cfont color=\"black\"\u003e\n                    \u003cxsl:value-of select=\"Telefono2\"\u003e\u003c/xsl:value-of\u003e\n                  \u003c/font\u003e\n                \u003c/td\u003e\n              \u003c/tr\u003e\n            \u003c/xsl:for-each\u003e\n```\n\n### Abrir archivos con _System.Diagnostics.Process.Start_\n\nComo ejercicio complementario se han creado unos botones en la página _aspx_ para abrir cada uno de los 3 archivos que se usan, el XML origen de los datos, el XSL con las normas de diseño y el VB con el código Visual Basic .NET. Para abrir los archivos se usa _System.Diagnostics.Process.Start_ que inicia un proceso nuevo con el nombre de un archivo o una aplicación:\n\n* si lleva 2 parámetros, el primero es el nombre del programa y el segundo el nombre del archivo que se desea abrir\n* si lleva sólo un parámetro, es el nombre del archivo y en este caso lo abre con el programa que Windows tenga asociado.\n\n```vbnet\nSystem.Diagnostics.Process.Start(Rutavb) 'abre el archivo con el programa asociado de Windows\nSystem.Diagnostics.Process.Start(\"Notepad.exe\", Rutavb) 'abre el archivo en Bloc de Notas\nSystem.Diagnostics.Process.Start(\"IExplore.exe\", Rutavb) 'abre el archivo en Internet Explorer\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fperez987%2Fhtml-from-xml-with-xsl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fperez987%2Fhtml-from-xml-with-xsl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fperez987%2Fhtml-from-xml-with-xsl/lists"}