2008-10-03 8 views
10

Estoy explorando el XML -> XSLT -> HTML meme para producir contenido web. Tengo muy poca experiencia con XSLT.Abstracciones XSLT

Tengo curiosidad por lo mecanismos están disponibles en XSLT para manejar abstracciones o "refactoring".

Por ejemplo, con HTML genérico y un lado de servicio include, muchas páginas pueden ser modeladas y descompuestas donde hay, digamos, encabezados comunes, nav y segmentos de pie de página, y la página es básicamente el cuerpo.

Los lenguajes de marcas comunes, JSP, PHP, ASP, van tan lejos como para permitir que todos los segmentos de tener contenido dinámico (por ejemplo, agregar el nombre del usuario a cada bloque de cabecera).

JSP va aún más lejos, ya que permite crear archivos de etiquetas, que pueden aceptar los argumentos que se utiliza al generar el contenido, e incluso rodear y trabajar en el contenido dentro de las propias etiquetas.

Tengo curiosidad funcionalidad similar se realiza dentro de XSLT. ¿Qué recursos hay para hacer un bloque reutilizable de XSLT para cosas como crear páginas HTML?

+1

"meme"? No creo que esto signifique lo que piensas que significa ... – annakata

Respuesta

14

Para mi propio proyecto, así es como dividí mis páginas. Había un archivo template.xsl que se importó por cada uno de mis XSL. La mayoría de las páginas solo tenían 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 al para que mis páginas agreguen su propia información a través del 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 only 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 ninguna parte.

<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 en un material común manner-- similares se definió y luego cada página solo podría 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.

+0

Esto es excelente y es exactamente lo que estaba buscando, gracias. –

+0

Me gusta esta respuesta. Una pequeña información adicional: si quiere poner algunas de las plantillas en archivos externos, una posible solución es Xinclude bortzmeyer

5

Plantillas, Incluye.

XSL es muy diferente a cualquier otro lenguaje de programación. Its rule based.

Te recomiendo que leas something sobre Xslt y luego pidas un poco más específico.

+0

Todos los tutoriales y tal que he visto lidiar con XSLT "en el pequeño", centrándose en la sintaxis, etc. Esto es más de "ahora que sé cómo" para usarlo, ¿cómo lo aplico? "tipo de pregunta. –

2

Hay tanto XSL incluir y declaraciones de importación que se pueden utilizar 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.

2

Usted puede dar a las plantillas de nombres y luego llamar a ellos a través de 'call-template'

En XSLT 2.0 se puede crear sus propias funciones (aunque lo encuentro la sintaxis tortuosa)

una zona maravillosa para explorar es usando XSLT para generar hojas de estilos 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.

+0

Me llevé una ducha para descubrir lo que decías aquí sobre XSLT -> XSLT, pero finalmente lo comí. Eso es muy inteligente también. Si XSLT no es lo suficientemente abstracto para usted, ya que es solo XML, hágalo más abstracto. "Escribirá código que escribe código que escribe código para comida", como dicen. Gracias. –

+0

No se preocupe, hágamelo saber si desea un ejemplo –

1

XSLT es poderosa, pero es muy diferente de la mayoría de los lenguajes de programación y es muy limitado en lo que hace a su disposición, así que las cosas que se han incorporado con otro idioma pueden necesitar alguna manipulación XSL bastante complejo para el trabajo con. Encontré the cheatsheet from here útil cuando estaba realizando mucho trabajo 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.

+0

Ese es siempre el desafío. Tomas tu experiencia previa e intentas aplicarla a algo nuevo. Sé que XSLT tiene una visión diferente del mundo, pero también sabía que la gente tenía que resolver problemas similares con ella, y tenía curiosidad de cómo lo hicieron. –

2

XSL es basado en en plantillas.

Los datos XML se pueden "reutilizar" en tres niveles. En el nivel más básico puede <xsl:for-each /> a través de XML.

Nota: Porque cada uno de los XSL no hace un bucle en los datos, solo está haciendo coincidir los datos. También cuando el "dentro" de una for-each su interior que "contexto" del XML (que es como el concepto de "ámbito" en la programación)

Un ejemplo del uso y re-uso 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 se encuentran dentro de los nodos de plantilla (segundo nivel de reutilización). Hay dos tipos de nodos de plantilla: Match y Named. Los nodos de la plantilla de coincidencia, actúan como el nodo for-each mencionado anteriormente, pero el motor de plantillas los llama automáticamente si los nodos coinciden 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 plantilla con nombre siempre se aplican explícitamente y pueden considerarse funciones similares.

Ejemplo de una plantilla de ajuste de la cual se Siempre ser llamado (porque un nodo raíz siempre existirá)

<xsl:template match="/"> 
    ... do some stuff ... 
</xsl:template> 

Una plantilla de ajuste de llamar a otra plantilla partido explícitamente

<xsl:template match="/"> 
    <xsl:apply-templates select="xml/data/too" /> 
</xsl:template> 

<xsl:template match="xml/data/too"> 
    ... do something ... 
</xsl:template> 

Nota: En Para que la plantilla de coincidencia funcione, debe existir el nodo XML que coincide. Si no existe, no hay coincidencia, por lo que esa plantilla es llamada no.

Ejemplo de una plantilla llamada

<xsl:template name="WriteOut"> 
    ... data with NO Context Here ... 
</xsl:template> 

O llamar a una plantilla con nombre desde una plantilla coincidente

<xsl:template match="/"> 
    <xsl:call-template name="WriteOut" /> 
<xsl:template> 

Nota: Usted puede mezclar y combinar en el que llamamos emparejado y con nombre plantillas desde, sólo tiene que ver en qué contexto se encuentra.

Todos los nodos de plantilla se encuentran en XSL hojas de estilos, y usted c un incluye y 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 incluye

<xsl:include href="header.xsl" /> 

En conclusión hay tres maneras a la abstracción de fragmentos de datos, a través de para-eaching, a través de plantillas o mediante la inclusión de hojas de estilo.