2008-09-16 26 views
7

Tengo una hoja de estilo xslt con múltiples xsl:import sy quiero unirlas todas en el archivo xslt.Combinar varias hojas de estilo xslt

Es una limitación del sistema que estamos usando cuando pasa alrededor de la hoja de estilos xsl como un objeto de cadena almacenado en la memoria. Esto se transmite a la máquina remota donde realiza la transformación. Como no se está cargando desde el disco, los enlaces href están rotos, por lo que debemos eliminar el xsl:import de la hoja de estilo.

¿Hay alguna herramienta que pueda hacer esto?

Respuesta

15

Puede usar una hoja de estilos XSL para combinar sus hojas de estilo. Sin embargo, esto es equivalente a usar el elemento xsl: include, no xsl: import (como Azat Razetdinov ya ha señalado). Puede leer sobre la diferencia here.

Por lo tanto, primero debe reemplazar xsl: import's con xsl: include's, resolver cualquier conflicto y probar si aún obtiene los resultados correctos. Después de eso, puede usar la siguiente hoja de estilo para fusionar sus hojas de estilo existentes en una sola. Sólo se aplican a la hoja de estilos principal:

<?xml version="1.0" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       version="1.0"> 

<xsl:template match="xsl:include"> 
    <xsl:copy-of select="document(@href)/xsl:stylesheet/*"/> 
</xsl:template> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

La primera plantilla reemplaza toda XSL: incluir de hojas de estilo con los incluidos por el uso de la función de documento, que se lee en el archivo de referencia en el atributo href. La segunda plantilla es identity transformation.

Lo he probado con Xalan y parece funcionar bien.

+1

Esto parece ser que no trabaja si incluye tener rutas relativas como abajo: Cualquier forma de estos escenarios también? – Shiv

0

¿Por qué le gustaría? Por lo general, están separados por un motivo posterior (a menudo mantenibilidad)

Siempre puede escribir la fusión usted mismo: lea los archivos XSL, seleccione los elementos de la plantilla que le interesan y escriba en un nuevo archivo maestro XSL.

+0

usuario explica: "(el archivo) se transmite a la máquina remota donde realiza la transformación.Dado que no se carga desde el disco los enlaces href se rompen" –

+0

edité el quetion a incluir la razón ya que esta respuesta fue publicada antes de que edición – roo

1

Una fusión manual probablemente sea la mejor opción.

La consideración principal será probablemente asegurarse de que la lógica para emparejar plantillas funcione en la hoja de estilos combinada.

+0

Eso es lo que me temía:.. \ – roo

2

Es imposible incluir hojas de estilo importadas en el archivo principal sin romper import precedence. Por ejemplo, define una variable de nivel superior en una hoja de estilo importada y la redefine en el archivo principal. Si fusiona dos archivos en uno, obtendrá dos variables con el mismo nombre e importancia de importación, lo que dará como resultado un error.

La solución alternativa es dos reemplazar xsl: importar con xsl: incluir y resolver cualquier conflicts. Después de que son seguros para reemplazar XSL: incluir instrucciones con contenidos de los archivos correspondientes, porque eso es lo XSLT-processor does:

La inclusión trabaja a nivel de árbol XML. El recurso ubicado por el valor del atributo href se analiza como un documento XML, y los elementos secundarios del elemento xsl: stylesheet en este documento reemplazan el elemento xsl: include en el documento incluido. El hecho de que se incluyan reglas o definiciones de plantilla no afecta la forma en que se procesan.

-1
import multiple xsl in single xsl 

     <xsl:import href="FpML_FXOption_Trade_Template1.xsl"/> 
     <xsl:apply-imports/> 

<calypso:keyword> 
       <calypso:name>DisplayOptionStyle</calypso:name> 
<calypso:value>Vanilla</calypso:value> 
</calypso:keyword> 

      <xsl:import href="FpML_FXOption_Trade_Template2.xsl"/> 
      <xsl:apply-imports/> 
Cuestiones relacionadas