Pergunta

Eu tenho uma folha de estilo xslt com vários xsl:importse 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:imports da folha de estilo.

Existe alguma ferramenta que possa fazer isso?

Foi útil?

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/>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top