Produzindo uma nova linha no XSLT

Eu quero produzir uma nova linha para saída de texto em XSLT. Alguma ideia?

O código XSL a seguir produzirá um caractere de nova linha (feed de linha):


 

Para um retorno de carro , use:

 
 

Meu método preferido para fazer isso é algo como:

      ...  

Então, sempre que você quiser produzir uma nova linha (talvez em csv), você pode produzir algo como:

  

Eu usei essa técnica quando a saída de sql de input xml. Na verdade, eu costumo criar variables ​​para vírgulas, citações e novas linhas.

Inclua o atributo Method = “text” na tag xsl: output e inclua newlines em seu conteúdo literal no XSL nos pontos apropriados. Se você preferir manter o código-fonte do seu XSL arrumado, use a entidade onde você quer uma nova linha.

Você pode usar:

veja o exemplo

   =  
  

se você escrever isso no arquivo, por exemplo

    

essa variável produzirá um novo infile de linha como:

 commons-dbcp_commons-dbcp = 1.2.2 junit_junit = 4.4 org.easymock_easymock = 2.4 

Eu adicionei a diretiva DOCTYPE que você vê aqui:

 < ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE xsl:stylesheet [  ]>  

Isso me permite usar o &nl; em vez de para produzir uma nova linha na saída. Como outras soluções, isso geralmente é colocado dentro de uma tag .

IMHO não é necessária mais informação do que a @Florjon. Talvez alguns pequenos detalhes sejam deixados para entender por que isso pode não funcionar para nós às vezes.

Primeiro de tudo, o (hex) ou (dec) dentro de um sempre funcionará, mas você pode não vê-lo.

  1. Não há nova linha em uma marcação HTML. Usando um simples
    vai fazer bem. Caso contrário, você verá um espaço em branco. A visualização da fonte do navegador informará o que realmente aconteceu. No entanto, há casos em que você espera esse comportamento, especialmente se o consumidor não for diretamente um navegador. Por exemplo, você quer criar uma página HTML e ver sua estrutura bem formatada com linhas vazias e idents antes de veiculá-la no navegador.
  2. Lembre-se de onde você precisa usar disable-output-escaping e onde não. Tome o seguinte exemplo onde eu tive que criar um xml de outro e declarar seu DTD de uma folha de estilo.

A primeira versão não escapa dos caracteres (padrão para xsl: text)

    <!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


           

E aqui está o resultado:

 < ?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"> 
   

Ok, faz o que esperamos, o escape é feito para que os caracteres que usamos sejam exibidos corretamente. A formatação da parte XML dentro do nó raiz é tratada por ident="yes" . Mas com um olhar mais atento , vemos que o caractere de nova linha não foi escapado e traduzido como está, realizando um avanço de linha duplo! Eu não tenho uma explicação sobre isso, será bom saber. Alguém?

A segunda versão não escapa dos personagens, então eles estão produzindo o que eles significam. A mudança feita foi:

 <!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


 

E aqui está o resultado:

 < ?xml version="1.0" encoding="utf-8"?> < !DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">    

e isso ficará bem. Tanto cr quanto lf são renderizados corretamente.

  1. Não esqueça que estamos falando de nl , não de crlf ( nl=lf ). Minha primeira tentativa foi usar apenas cr: e enquanto a saída xml foi validada pelo DOM corretamente.

Eu estava vendo um xml corrompido:

 < ?xml version="1.0" encoding="utf-8"?> riptions SYSTEM "Subscriptions.dtd">   

O analisador DOM desconsiderou os caracteres de controle, mas o renderizado não. Eu passei um bom tempo batendo minha cabeça antes de perceber o quão bobo eu não estava vendo isso!

Para o registro, eu uso uma variável dentro do corpo com ambos CRLF apenas para ter 100% de certeza que funcionará em todos os lugares.

Eu encontrei uma diferença entre novas linhas literais em e novas linhas literais usando .

Enquanto newlines literais funcionavam bem no meu ambiente (usando o Saxon e o processador padrão Java XSLT), meu código falhou quando foi executado por outro grupo rodando em um ambiente .NET.

Mudando para entidades ( ) tenho meu código de geração de arquivos em execução de forma consistente em ambos Java e .NET.

Além disso, as novas linhas literais são vulneráveis ​​a serem reformatadas por IDEs e podem se perder inadvertidamente quando o arquivo é mantido por alguém que não conhece.

Eu notei pela minha experiência que produzir uma nova linha dentro de uma cláusula não funciona. Eu estava tentando fazer algo como:

    My value:     My other value:      

Qualquer coisa que eu tentei colocar nessa “nova linha” (o nó vazio ) simplesmente não funcionou (incluindo a maioria das sugestões mais simples nesta página), sem mencionar o fato de que o HTML simplesmente não funciona lá, então, eventualmente, eu tive que dividi-lo em duas variables, chamá-las fora do escopo e colocar um simples
entre elas, ou seja:

    My value:         My other value:      

Sim, eu sei, não é a solução mais sofisticada, mas funciona, apenas compartilhando minha experiência de frustração com XSLs;)

Eu segundo o método de Nic Gibson, este sempre foi meu favorito:

   

No entanto, tenho usado a tarefa Ant para criar folhas de estilo e executá-las nos arquivos. A tarefa fará modelos de valor de atributo, por exemplo, $ {DSTAMP}, mas também reformatará seu xml, portanto, em alguns casos, a referência de entidade é preferível.

 
 

Eu não poderia simplesmente usar a abordagem porque se eu formatar o arquivo XML usando XSLT a entidade desaparecerá. Então eu tive que usar um pouco mais de aproximação usando variables

      

Podes tentar,

 
 

Vai funcionar.

basta adicionar esta tag:

 

funciona para mim 😉 .