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:
javax.xml.transform.TransformerFactory
para net.sf.saxon.TransformerFactoryImpl
, CLASSPATH
ou
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:
CLASSPATH
para o Ant antes de iniciá-lo:
CLASSPATH
do sistema ou -lib
para ant
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:
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.