+1: é mais robusto do que o que <xsl:text>contém uma abordagem de nova linha se você usar qualquer coisa que possa reformatar seu arquivo XSL e mexer com o espaço em branco.
11261 Ian Roberts
49
Meu método preferido para fazer isso se parece com:
<xsl:stylesheet><xsl:outputmethod='text'/><xsl:variablename='newline'><xsl:text></xsl:text></xsl:variable><!-- note that the layout there is deliberate -->
...
</xsl:stylesheet>
Então, sempre que você desejar gerar uma nova linha (talvez em csv), poderá gerar algo como o seguinte:
Observe que a resposta de Florjon abaixo é consideravelmente mais estável que a minha.
precisa
1
Provavelmente vale a pena adicionar a declaração xml:space="preserve"ao xsl:textelemento para aumentar a estabilidade, mas eu concordo que a resposta de @ Florjon é provavelmente mais segura.
Flynn1179
Esta solução tem a desvantagem de incluir também qualquer recuo, o que pode não ser desejável.
217156 wanderingham
47
Inclua o atributo Method = "text" na tag xsl: output e inclua novas linhas no seu conteúdo literal no XSL nos pontos apropriados. Se você preferir manter o código-fonte do seu XSL organizado, use a entidade em que deseja uma nova linha.
IMHO, não são necessárias mais informações do que @Florjon deu. Talvez alguns pequenos detalhes sejam deixados para entender por que às vezes isso não funciona para nós.
Primeiro de tudo, o 
(hex) ou 
(dec) dentro de um <xsl:text/>sempre funcionará, mas você pode não vê-lo.
Não há nova linha em uma marcação HTML. Usando um simples <br/>vai fazer bem. Caso contrário, você verá um espaço em branco. Visualizar a fonte do navegador informa o que realmente aconteceu. No entanto, há casos em que você espera esse comportamento, principalmente se o consumidor não for diretamente um navegador. Por exemplo, você deseja criar uma página HTML e visualizar sua estrutura bem formatada com linhas e identificadores vazios antes de veiculá-la no navegador.
Lembre-se de onde você precisa usar disable-output-escapinge onde não precisa . Pegue o exemplo a seguir, onde eu tive que criar um xml de outro e declarar seu DTD em uma folha de estilo.
A primeira versão escapa dos caracteres (padrão para xsl: text)
<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:outputmethod="xml"indent="yes"encoding="utf-8"/><xsl:templatematch="/"><xsl:text><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text><xsl:copy><xsl:apply-templatesselect="*"mode="copy"/></xsl:copy></xsl:template><xsl:templatematch="@*|node()"mode="copy"><xsl:copy><xsl:apply-templatesselect="@*|node()"mode="copy"/></xsl:copy></xsl:template></xsl:stylesheet>
E aqui está o resultado:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">
<Subscriptions><Userid="1"/></Subscriptions>
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, olhando mais de perto , 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. Qualquer um?
A segunda versão não escapa aos personagens, então eles estão produzindo o que devem fazer. A alteração feita foi:
<xsl:textdisable-output-escaping="yes"><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text>
E aqui está o resultado:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"><Subscriptions><Userid="1"/></Subscriptions>
e tudo ficará bem. Cr e lf são renderizados corretamente.
Não esqueça que estamos falando nl, não crlf( nl=lf). Minha primeira tentativa foi usar apenas cr: Þ enquanto o xml de saída foi validado pelo DOM corretamente.
Eu estava vendo um xml corrompido:
<?xml version="1.0" encoding="utf-8"?><Subscriptions>riptions SYSTEM "Subscriptions.dtd">
<Userid="1"/></Subscriptions>
O analisador DOM desconsiderou os caracteres de controle, mas o renderizado não. Passei bastante 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 os dois CRLF apenas para ter 100% de certeza de que funcionará em qualquer lugar.
Isso me permite usar em &nl;vez de 
produzir uma nova linha na saída. Como outras soluções, isso geralmente é colocado dentro de uma <xsl:text>tag.
No entanto, tenho usado a tarefa Ant <echoxml> para criar folhas de estilo e executá-las em arquivos. A tarefa criará modelos de valor de atributo, por exemplo, $ {DSTAMP}, mas também reformatará seu xml; portanto, em alguns casos, a referência da entidade é preferível.
Se você usar uma variável, seria melhor usar em selectvez de xsl:text. Exemplo: <xsl:variable name="nl" select="'
'"/>Dessa forma, você não cria um RTF desnecessário (fragmento da árvore de resultados).
Daniel Haley
2
Eu encontrei uma diferença entre as novas <xsl:text>linhas literais e as novas linhas literais usando 
.
Enquanto novas linhas literais funcionavam bem em meu ambiente (usando o Saxon e o processador Java XSLT padrão), meu código falhou quando foi executado por outro grupo em execução em um ambiente .NET.
Mudar para entity ( 
) fez com que meu código de geração de arquivos fosse executado consistentemente em Java e .NET.
Além disso, as novas linhas literais são vulneráveis a serem reformatadas pelos IDEs e podem inadvertidamente se perder quando o arquivo é mantido por alguém que 'não conhece'.
Percebi pela minha experiência que produzir uma nova linha dentro de uma <xsl:variable>cláusula não funciona. Eu estava tentando fazer algo como:
<xsl:variablename="myVar"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My value: </xsl:text><xsl:value-ofselect="@myValue"/><xsl:text></xsl:text><!--NEW LINE--><xsl:text>My other value: </xsl:text><xsl:value-ofselect="@myOtherValue"/></xsl:when></xsl:choose><xsl:variable><div><xsl:value-ofselect="$myVar"/></div>
Tudo o que tentei colocar nessa "nova linha" (o <xsl:text>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 funcionará lá, então, eventualmente, teve que dividi-lo para 2 variáveis, chamá-los fora do <xsl:variable>escopo e colocar um simples <br/>entre eles, ou seja:
<xsl:variablename="myVar1"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My value: </xsl:text><xsl:value-ofselect="@myValue"/></xsl:when></xsl:choose><xsl:variable><xsl:variablename="myVar2"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My other value: </xsl:text><xsl:value-ofselect="@myOtherValue"/></xsl:when></xsl:choose><xsl:variable><div><xsl:value-ofselect="$myVar1"/><br/><xsl:value-ofselect="$myVar2"/></div>
Sim, eu sei, não é a solução mais sofisticada, mas funciona, apenas compartilhando minha experiência de frustração com XSLs;)
Eu não poderia simplesmente usar a <xsl:text>
</xsl:text>abordagem, porque se eu formatar o arquivo XML usando XSLT, a entidade desaparecerá. Então eu tive que usar uma abordagem um pouco mais abrangente sobre a abordagem usando variáveis
Respostas:
O seguinte código XSL produzirá um caractere de nova linha (avanço de linha):
Para um retorno de carro , use:
fonte
<xsl:text>
contém uma abordagem de nova linha se você usar qualquer coisa que possa reformatar seu arquivo XSL e mexer com o espaço em branco.Meu método preferido para fazer isso se parece com:
Então, sempre que você desejar gerar uma nova linha (talvez em csv), poderá gerar algo como o seguinte:
Eu usei essa técnica ao gerar sql a partir da entrada xml. De fato, costumo criar variáveis para vírgulas, aspas e novas linhas.
fonte
xml:space="preserve"
aoxsl:text
elemento para aumentar a estabilidade, mas eu concordo que a resposta de @ Florjon é provavelmente mais segura.Inclua o atributo Method = "text" na tag xsl: output e inclua novas linhas no seu conteúdo literal no XSL nos pontos apropriados. Se você preferir manter o código-fonte do seu XSL organizado, use a entidade
em que deseja uma nova linha.fonte
Você pode usar:
<xsl:text> </xsl:text>
veja o exemplo
se você escrever isso no arquivo, por exemplo
essa variável produzirá uma nova linha infile como:
fonte
IMHO, não são necessárias mais informações do que @Florjon deu. Talvez alguns pequenos detalhes sejam deixados para entender por que às vezes isso não funciona para nós.
Primeiro de tudo, o


(hex) ou

(dec) dentro de um<xsl:text/>
sempre funcionará, mas você pode não vê-lo.<br/>
vai fazer bem. Caso contrário, você verá um espaço em branco. Visualizar a fonte do navegador informa o que realmente aconteceu. No entanto, há casos em que você espera esse comportamento, principalmente se o consumidor não for diretamente um navegador. Por exemplo, você deseja criar uma página HTML e visualizar sua estrutura bem formatada com linhas e identificadores vazios antes de veiculá-la no navegador.disable-output-escaping
e onde não precisa . Pegue o exemplo a seguir, onde eu tive que criar um xml de outro e declarar seu DTD em uma folha de estilo.A primeira versão escapa dos caracteres (padrão para xsl: text)
E aqui está o resultado:
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, olhando mais de perto , 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. Qualquer um?A segunda versão não escapa aos personagens, então eles estão produzindo o que devem fazer. A alteração feita foi:
E aqui está o resultado:
e tudo ficará bem. Cr e lf são renderizados corretamente.
nl
, nãocrlf
(nl=lf
). Minha primeira tentativa foi usar apenas cr:
e enquanto o xml de saída foi validado pelo DOM corretamente.Eu estava vendo um xml corrompido:
O analisador DOM desconsiderou os caracteres de controle, mas o renderizado não. Passei bastante 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 os dois CRLF apenas para ter 100% de certeza de que funcionará em qualquer lugar.
fonte
Eu adicionei a
DOCTYPE
diretiva que você vê aqui:Isso me permite usar em
&nl;
vez de

produzir uma nova linha na saída. Como outras soluções, isso geralmente é colocado dentro de uma<xsl:text>
tag.fonte
Podes tentar,
Vai funcionar.
fonte
Segundo o método de Nic Gibson, esse sempre foi o meu favorito:
No entanto, tenho usado a tarefa Ant <echoxml> para criar folhas de estilo e executá-las em arquivos. A tarefa criará modelos de valor de atributo, por exemplo, $ {DSTAMP}, mas também reformatará seu xml; portanto, em alguns casos, a referência da entidade é preferível.
fonte
select
vez dexsl:text
. Exemplo:<xsl:variable name="nl" select="'
'"/>
Dessa forma, você não cria um RTF desnecessário (fragmento da árvore de resultados).Eu encontrei uma diferença entre as novas
<xsl:text>
linhas literais e as novas linhas literais usando

.Enquanto novas linhas literais funcionavam bem em meu ambiente (usando o Saxon e o processador Java XSLT padrão), meu código falhou quando foi executado por outro grupo em execução em um ambiente .NET.
Mudar para entity (


) fez com que meu código de geração de arquivos fosse executado consistentemente em Java e .NET.Além disso, as novas linhas literais são vulneráveis a serem reformatadas pelos IDEs e podem inadvertidamente se perder quando o arquivo é mantido por alguém que 'não conhece'.
fonte
Percebi pela minha experiência que produzir uma nova linha dentro de uma
<xsl:variable>
cláusula não funciona. Eu estava tentando fazer algo como:Tudo o que tentei colocar nessa "nova linha" (o
<xsl:text>
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 funcionará lá, então, eventualmente, teve que dividi-lo para 2 variáveis, chamá-los fora do<xsl:variable>
escopo e colocar um simples<br/>
entre eles, ou seja:Sim, eu sei, não é a solução mais sofisticada, mas funciona, apenas compartilhando minha experiência de
frustraçãocom XSLs;)fonte
Eu não poderia simplesmente usar a
<xsl:text>
</xsl:text>
abordagem, porque se eu formatar o arquivo XML usando XSLT, a entidade desaparecerá. Então eu tive que usar uma abordagem um pouco mais abrangente sobre a abordagem usando variáveisfonte
basta adicionar esta tag:
funciona para mim ;) .
fonte