Pergunta
Eu tenho uma folha de estilo xslt com vários xsl:import
se quero mesclá-los todos em um único arquivo xslt.
É uma limitação do sistema que estamos usando, onde ele passa a folha de estilo xsl como um objeto string armazenado na memória.Isso é transmitido para a máquina remota onde realiza a transformação.Como não está sendo carregado do disco, os links href estão quebrados, então precisamos remover o xsl:import
s da folha de estilo.
Existe alguma ferramenta que possa fazer isso?
Solução
Você pode usar uma folha de estilo XSL para mesclar suas folhas de estilo.No entanto, isso equivale a usar o elemento xsl:include, não xsl:import (como Azat Razetdinov já apontou).Você pode ler sobre a diferença aqui.
Portanto, você deve primeiro substituir o xsl:import pelo xsl:include, resolver quaisquer conflitos e testar se ainda obtém os resultados corretos.Depois disso, você pode usar a seguinte folha de estilo para mesclar suas folhas de estilo existentes em uma.Basta aplicá-lo à sua folha de estilo mestre:
<?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>
O primeiro modelo substitui todos os xsl:include pelas folhas de estilo incluídas usando a função document, que lê o arquivo referenciado no atributo href.O segundo modelo é o transformação de identidade.
Eu testei com Xalan e parece funcionar bem.
Outras dicas
É impossível incluir folhas de estilo importadas no arquivo principal sem quebrar precedência de importação.Por exemplo, você define uma variável de nível superior em uma folha de estilo importada e a redefine no arquivo principal.Se você mesclar dois arquivos em um, obterá duas variáveis com o mesmo nome e precedência de importação, o que resultará em um erro.
A solução alternativa é substituir xsl:import’s por xsl:include’s e resolver qualquer conflitos.Depois disso, você estará seguro para substituir as instruções xsl:include pelo conteúdo dos arquivos correspondentes, porque é isso que O processador XSLT faz:
A inclusão funciona no nível da árvore XML.O recurso localizado pelo valor do atributo href é analisado como um documento XML e os filhos do elemento xsl:stylesheet neste documento substituem o elemento xsl:include no documento incluído.O facto de as regras ou definições do modelo serem incluídas não afecta a forma como são processadas.
Uma mesclagem manual provavelmente será a melhor opção.
A principal consideração provavelmente será garantir que a lógica para combinar modelos funcione na folha de estilo combinada.
Por que você iria querer?Afinal, eles geralmente são separados por um motivo (geralmente manutenção)
Você sempre pode escrever a mesclagem sozinho - leia os arquivos XSL, selecione os itens do modelo de seu interesse e grave em um novo arquivo XSL mestre ...
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/>