Pregunta

Tengo una hoja de estilo xslt con múltiples xsl:imports y quiero fusionarlos todos en un archivo xslt.

Es una limitación del sistema que estamos usando donde pasa la hoja de estilo 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:imports de la hoja de estilo.

¿Existe alguna herramienta que pueda hacer esto?

¿Fue útil?

Solución

Puede utilizar una hoja de estilo XSL para fusionar sus hojas de estilo.Sin embargo, esto equivale a usar el elemento xsl:include, no xsl:import (como ya señaló Azat Razetdinov).Puedes leer sobre la diferencia. aquí.

Por lo tanto, primero debe reemplazar xsl:import por xsl:include, resolver cualquier conflicto y probar si aún obtiene los resultados correctos.Después de eso, puedes usar la siguiente hoja de estilo para fusionar tus hojas de estilo existentes en una sola.Simplemente aplícalo a tu hoja de estilo maestra:

<?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 todos los xsl:include con las hojas de estilo incluidas utilizando la función de documento, que lee el archivo al que se hace referencia en el atributo href.La segunda plantilla es la transformación de identidad.

Lo probé con Xalan y parece funcionar bien.

Otros consejos

Es imposible incluir hojas de estilo importadas en el archivo principal sin romperlas. prioridad de importación.Por ejemplo, define una variable de nivel superior en una hoja de estilo importada y la redefine en el archivo principal.Si combina dos archivos en uno, obtendrá dos variables con el mismo nombre y prioridad de importación, lo que generará un error.

La solución es reemplazar xsl:import por xsl:include y resolver cualquier problema. conflictos.Después de eso, puede reemplazar xsl: incluya instrucciones con el contenido de los archivos correspondientes, porque eso es lo que El procesador XSLT no:

La inclusión funciona a nivel del á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 al 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.

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

La consideración principal probablemente será asegurarse de que la lógica para hacer coincidir las plantillas funcione en la hoja de estilo combinada.

¿Por qué querrías hacerlo?Después de todo, generalmente están separados por una razón (a menudo, mantenimiento)

Siempre puedes escribir la combinación tú mismo: lee los archivos XSL, selecciona los elementos de la plantilla que te interesan y escribe en un nuevo archivo XSL maestro...

 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/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top