Como executar o XSLT 2.0 com ant?

Estou tentando executar uma transformação XSLT de um arquivo ant .

Estou usando uma folha de estilos XSLT 2.0 com um analisador de saxon 9 (suportando XSLT 2.0).

O problema é que parece que ant está sempre chamando um analisador XSLT 1.0.

Aqui está meu arquivo ant:

  

Se eu ligar diretamente (sem formiga), está funcionando.

Qualquer ideia ?

O problema é que, enquanto Saxon é adicionado ao caminho de class, o mecanismo JAXP padrão para determinar qual TransformerFactory é usado e ele usará o padrão que é Xalan. Você precisa:

  • Configure a variável de sistema javax.xml.transform.TransformerFactory para net.sf.saxon.TransformerFactoryImpl ,
  • Adicione saxon9.jar à variável de sistema CLASSPATH ou
  • Use dentro do elemento xslt

Se você está tendo este problema, verifique se você não está usando o Ant 1.8.1, porque há um bug no Ant 1.8.1 que impede que isso funcione. (Embora este não seja o problema no post original, porque isso foi antes do Ant 1.8.1 ser lançado).

Suas opções são:

  1. Use uma versão do Ant que não tenha o bug (por exemplo, Ant 1.7.1).
  2. Especifique explicitamente o saxon9.jar no CLASSPATH para o Ant antes de iniciá-lo:
    • Definir a variável de ambiente CLASSPATH do sistema ou
    • Use a opção de linha de comando -lib para ant
  3. Defina sua própria tarefa usando o SAXON Ant (conforme descrito por outra resposta neste encadeamento).
  4. Solução alternativa adicionando processor="org.apache.tools.ant.taskdefs.optional.TraXLiaison" como um atributo do elemento de tarefa xslt .

Eu sugiro usar a opção 1, seguida da opção 4.

A opção 2 funcionará, mas atribui a responsabilidade à pessoa que executa formiga de configurar seu ambiente e executar a formiga corretamente. Eu suponho que você não quer isso, e é por isso que você está tentando fazer com que o atributo classpath na tarefa xslt funcione.

A opção 3 tem limitações, porque o SAXON Ant requer o download e a instalação do arquivo JAR. O SAXON Ant também não funciona com o SAXON 9.2 ou posterior (e o SAXON Ant não foi atualizado desde que foi criado em junho de 2008).

Em teoria, especificar um subelemento de factory faz com que o processador XSLT que você quer usar seja explícito – para evitar que o carregador de class encontre um processador XSLT diferente em sua pesquisa e o use em vez de seu processador XSLT que está mais abaixo no CLASSPATH . Na prática (pelo menos em ant 1.7.0, 1.7.1 e 1.8.0) se o subelemento de factory é especificado, a tarefa xslt ignora o atributo classpath – o que significa que você precisa recorrer explicitamente à especificação do CLASSPATH (opção 2). Por isso, não ajuda a resolver o problema original. No entanto, isso parece ter sido corrigido no código-fonte do Ant, portanto, poderia funcionar em liberações após o 1.8.1.

Este tutorial parece dar instruções passo a passo sobre como fazer o que você está perguntando:

http://www.abbeyworkshop.com/howto/xslt/ant-saxon/index.html

Daí parece que você está fazendo a coisa certa. Tem certeza de que precisa das barras duplas?

Atualização: A documentação do xslt Ant menciona a propriedade ‘factory’ que pode ajudá-lo a se aproximar:

http://ant.apache.org/manual/Tasks/style.html

Em vez de esperar que isso seja corrigido na versão 1.8.2 e, em seguida, esperar que todos atualizem para a versão 1.8.2, você pode rolar sua própria macro XSLT (para situações onde você deseja usar explicitamente o Saxon, em vez de um mecanismo XSLT selecionado pelo usuário) )

                  

você pode então chamá-lo como (assumindo que xmlns: mydep = “com.mycompany.mydepartment” esteja configurado no elemento do projeto)

      

Você pode encontrar os documentos para passar parâmetros para o Saxon em http://www.saxonica.com/documentation/using-xsl/commandline.xml

EDIT: Dr. Michael Kay salientou que o AntTransform não é mais suportado, nem recomendado.

Crie um taskdef da class Saxon AntTransform :

     


Comecei a usar a tarefa padrão com o jar de saxon especificado em , mas estava com problemas de desempenho. Parecia “travar” um pouco quando a tarefa era chamada. Eu descobri que adicionando processor="trax" e especificando ajuda a executar muito mais rápido.

      

Pelo menos no ant 1.8.0, a tarefa xslt com um caminho de class especificado é muito lenta. O problema parece ser o carregamento do caminho de class. Eu corri o ant no JDB e ele gastou todo o tempo extra no org.apache.tools.ant.AntClassLoader.loadClass lendo arquivos zip.

Eu tentei isso antes de executar ant ele foi muito mais rápido:

ant -lib /path/to/saxon/saxon9.jar

O macrodef de Tom Howard funciona melhor e, embora tenha uma syntax ímpar para os parâmetros XSLT, pelo menos é possível.

Intereting Posts