html - transformar - Abstracciones XSLT
xslt introduction (6)
Hay dos sentencias Incluir e Importar xsl que puede usar para abstraer partes de la página. XSLT en sí mismo es mucho el tipo de cosa que puede reproducir el comportamiento del tipo de archivo de etiqueta. Edita sus archivos de datos xml con las etiquetas que desea. Mientras tanto, sus plantillas xsl van a saber qué hacer con esas etiquetas y luego las encuentran.
Estoy explorando XML -> XSLT -> HTML meme para producir contenido web. Tengo muy poca experiencia con XSLT.
Tengo curiosidad de saber qué mecanismos están disponibles en XSLT para manejar abstracciones o "refactorización".
Por ejemplo, con HTML genérico y un lado del servicio include, muchas páginas pueden ser modeladas y descompuestas en donde hay, por ejemplo, segmentos comunes de encabezado, navegación y pie de página, y la página misma es básicamente el cuerpo.
Los lenguajes de marcado comunes, JSP, PHP, ASP, llegan a permitir que todos esos segmentos tengan contenido dinámico (como agregar el nombre de usuario a cada bloque de encabezado).
JSP va aún más lejos al permitirle crear archivos de etiquetas, que pueden aceptar argumentos que se utilizarán al generar el contenido, e incluso rodear y trabajar sobre el contenido dentro de las etiquetas.
Tengo curiosidad por la funcionalidad similar que se realiza dentro de XSLT. ¿Qué recursos hay para hacer un bloque reutilizable de XSLT para cosas como crear páginas HTML?
Plantillas, Incluye.
Xsl es muy diferente de cualquier otro lenguaje de programación. Its rule based.
Te recomiendo que leas algo sobre Xslt y luego pidas un poco más específico.
Puede dar nombres de plantillas y luego llamarlos a través de ''call-template''
En XSLT 2.0 puede crear sus propias funciones (aunque creo que la sintaxis es tortuosa)
Un área maravillosa para explorar es usar XSLT para generar hojas de estilo XSLT. Esto le permite automatizar escenarios de conversión comunes en los que el 90% de la hoja de estilo es un texto estándar. Para hacer esto, debe familiarizarse con ''namespace-alias''. Es una excelente manera de ampliar su conocimiento del idioma.
XSLT es potente, pero es muy diferente de la mayoría de los lenguajes de programación y es bastante limitado en lo que pone a su disposición, por lo que las cosas que ha incorporado en otro idioma pueden necesitar una manipulación xsl bastante compleja para trabajar. Encontré la hoja de trucos de aquí útil cuando estaba trabajando mucho en XSLT hace un par de semanas.
No espere que XSLT haga las cosas de una manera particular y probablemente pueda encontrar buenas maneras de hacer esas cosas, pero si tiene demasiada idea acerca de cómo debería funcionar algo, es fácil quedarse atascado.
Para mi propio proyecto, así es como dividí mis páginas. Había un archivo template.xsl que fue importado por cada uno de mis XSL. La mayoría de las páginas acababan de tener template.xsl, pero algunas páginas como carrito, etc. necesitaban su propio debido a los diferentes tipos de datos que estaban analizando.
<page title="Home">
<navigation>
<!-- something here -->
</navigation>
<main>
<!-- something here -->
</main>
</page>
Este es un fragmento de mi template.xsl. Lancé todas las cosas comunes aquí, y luego di la oportunidad a mis páginas de agregar su propia información a través call-template
.
<xsl:template match="/page" name="page">
<html>
<head>
<title><xsl:value-of select="(@title)" /></title>
<xsl:call-template name="css" />
<xsl:call-template name="script" />
</head>
<body>
<xsl:call-template name="container" />
</body>
</html>
</xsl:template>
Un ejemplo de cómo respondería mi etiqueta css. Tenga en cuenta que llama a css-extended.
css solo tenía el CSS común que se aplicaría en todas las páginas. Algunas páginas necesitan más. Esos podrían anular css-extended. Tenga en cuenta que es necesario porque call-template
fallará si una página llama a una plantilla, pero no la define en ningún lugar.
<xsl:template name="css">
<link rel="stylesheet" type="text/css" href="{$cssPath}reset.css" />
<link rel="stylesheet" type="text/css" href="{$cssPath}style.css" />
<link rel="stylesheet" type="text/css" href="{$cssPath}layout.css" />
<xsl:call-template name="css-extended" />
</xsl:template>
<!-- This is meant to be blank. It gets overriden by implementing stylesheets -->
<xsl:template name="css-extended" />
Mi contenedor funcionaría de manera similar, se definieron cosas comunes y luego cada página podría simplemente proporcionar una implementación. Una implementación predeterminada estaba en el XSL. (en content
)
<xsl:template name="container">
<div id="container">
<xsl:call-template name="header" />
<xsl:call-template name="content" />
<xsl:call-template name="footer" />
</div>
</xsl:template>
<xsl:template name="content">
<div id="content">
<div id="content-inner">
<xsl:call-template name="sideBar" />
<xsl:call-template name="main" />
</div>
</div>
</xsl:template>
<xsl:template name="main">
<div id="main">
<xsl:apply-templates select="main" />
<xsl:call-template name="main-extended" />
</div>
</xsl:template>
<!-- This is meant to be blank. It gets overriden by implementing stylesheets -->
<xsl:template name="main-extended" />
<xsl:template name="footer">
<div id="footer">
<div id="footer-inner">
<!-- Footer content here -->
</div>
</div>
</xsl:template>
Funcionó bastante bien para mí. Si hay alguna pregunta que pueda responderle, hágamelo saber.
XSL se basa en plantillas.
Los datos XML se pueden "reutilizar" en tres niveles. En el nivel más básico, puede <xsl:for-each />
través de XML.
Nota: Porque cada uno de los XSL no está recorriendo los datos, solo está haciendo coincidir los datos. También cuando su "interior" es para cada uno su "contexto" dentro del XML (que es como el concepto de "alcance" en la programación)
Un ejemplo de uso y reutilización de un para cada
<xsl:for-each select="/xml/data/here">
... do some stuff ...
</xsl:for-each>
<xsl:for-each select="/xml/data/here">
... do some DIFFERENT stuff ...
</xsl:for-each>
Los nodos for-each están contenidos dentro de los nodos de plantilla (segundo nivel de reutilización). Hay dos tipos de nodos de plantilla: Match y Named. Los nodos de plantilla coinciden , actúan como el nodo for-each mencionado anteriormente, pero el motor de la plantilla los llama automáticamente si se unen los nodos cuando se inicia el procesamiento XSL. Los nodos de plantilla de coincidencia también se pueden aplicar explícitamente. Por otro lado, los nodos de plantillas con nombre siempre se aplican explícitamente y pueden considerarse funciones similares.
Ejemplo de una plantilla de coincidencia a la que siempre se llamará (porque siempre existirá un nodo raíz)
<xsl:template match="/">
... do some stuff ...
</xsl:template>
Una plantilla de coincidencia que llama explícitamente a otra plantilla de coincidencia
<xsl:template match="/">
<xsl:apply-templates select="xml/data/too" />
</xsl:template>
<xsl:template match="xml/data/too">
... do something ...
</xsl:template>
Nota: para que la plantilla de coincidencia funcione, debe existir el nodo XML al que se asocia. Si no, no hay coincidencia, por lo que no se llama a esa plantilla.
Ejemplo de una plantilla con nombre
<xsl:template name="WriteOut">
... data with NO Context Here ...
</xsl:template>
O llamando a una plantilla con nombre de una plantilla coincidente
<xsl:template match="/">
<xsl:call-template name="WriteOut" />
<xsl:template>
Nota: Puede mezclar y combinar desde dónde llama las plantillas coincidentes y las nombradas, solo tiene que observar en qué contexto se encuentra.
Todos los nodos de plantilla se guardan en hojas de estilo XSL , y puede incluir e importar varias hojas de estilo. Por ejemplo, puede contener todas las plantillas que tratan con nodos de encabezado HTML en una plantilla y todas las plantillas que tratan con los nodos de cuerpo HTML en otra. Luego puede crear una hoja de estilo que incluya hojas de estilo de encabezado y cuerpo.
Ejemplo de un nodo de inclusión
<xsl:include href="header.xsl" />
En conclusión, hay tres formas de abstraer trozos de datos, a través de forjar, mediante plantillas o mediante la inclusión de hojas de estilo.