Como inserir o & nbsp; em XSLT

207

Como posso inserir

 

Em uma folha de estilo XSLT, continuo recebendo este erro:

Erro de análise XML: entidade indefinida

Essencialmente, quero um caractere de espaço sem interrupção no modelo XSLT.

JL.
fonte
2
Você também pode usar o & # xA0; mesmo para o & # 160; veja aqui stackoverflow.com/questions/7511214/…
user3766111

Respostas:

337

Use o código da entidade  .

 é uma "referência de entidade de caracteres" em HTML. Não existe uma entidade nomeada para espaço sem quebra no XML; portanto, você usa o código  .

A Wikipedia inclui uma lista de entidades XML e HTML , e você pode ver que existem apenas 5 "entidades predefinidas" em XML, mas o HTML tem mais de 200. Também vou apontar para Criando um espaço (& nbsp;) em XSL que possui excelentes respostas.

brabster
fonte
3
Recentemente, enfrentamos uma situação em que apenas um dos muitos XSL parou de trabalhar com essa técnica e começamos a mostrar um personagem estranho. No entanto, se eu usar a técnica CDATA do WaterSoul, ela funcionará.
@BrianReindel, isso provavelmente significa que você usou a referência de entidade numérica incorreta, ou seja, em Švez da  última, que sempre será resolvida para um espaço sem quebra de Unicode.
Abel
O link Top Ten Java e XSLT Tips é realmente útil.
LCJ 5/02
<xsl: text> & # 160; </ xsl: text> que separar os dois campos
Manash Ranjan Dakua
1
O link está podre.
GSerg
37

&#160;funciona muito bem. No entanto, ele exibirá um desses caracteres estranhos na codificação ANSI. <xsl:text>funcionou melhor para mim.

<xsl:text> </xsl:text>
Saroj
fonte
3
Usando a resposta aceita, acabei com um espaço de quebra de linha na minha saída XML (pelo menos é o que parecia no editor XML do VS2010). Usando esta resposta, recebo exatamente 1 espaço.
Mathijs Flietstra
1
@ Matthijs, este é um espaço, não um espaço ininterrupto, que não é o mesmo. Se o VS mostrar incorretamente, verifique sua codificação (o VS é perfeitamente capaz de mostrar isso corretamente e deve ser independente da codificação, portanto é mais provável que você esteja fazendo outra coisa errada).
Abel
25

Pode-se também fazer isso:

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>
WaterSoul
fonte
2
Isso funcionará se o processador suportardisable-output-escaping , para o qual não é necessário e foi preterido no XSLT 2.0 e, mais ainda, no 3.0. Nessas versões, você pode alcançar o mesmo efeito com xsl:character-mapgarantia de trabalhar com vários processadores. Além disso, isso coloca uma entidade nomeada &nbsp;na saída, que não é necessariamente a mesma que um espaço sem quebra e o terminal receptor deve ter essa entidade declarada (em HTML, geralmente é implicitamente).
Abel
21

Usa isto

<xsl:text disable-output-escaping="yes">&amp;</xsl:text>nbsp;

edit: Downvoters provavelmente devem validar que isso funcione primeiro (funciona e é a solução mais geral para o problema).

jagprinderdeep
fonte
1
Não tenho certeza, mas eu testei a minha abordagem e ele funciona, então eu não estou certo o que o downvote foi para :(
jagprinderdeep
2
Além disso, a resposta aceita não será válida para todos os analisadores de acordo com a página vinculada; apenas um heads-up
jagprinderdeep
1
Eu já mencionei o motivo do meu voto negativo, mas se eu recusasse essa resposta, o motivo seria: ele responde à pergunta errada. O OP perguntou claramente como colocar um espaço inquebrável, usando xslt, e você respondeu como colocar a sequência e comercial-nbsp-ponto-e-vírgula. E brigar sobre votos negativos também é desagradável. Mas falando sério, você nunca disse isso sobre o CDATA?
Michael Krelin - hacker 22/09/09
1
Ok, jagprinderdeep, eu revogo meu voto negativo, mas em troca, por favor, vá me visitar quando eu atingir o asilo mental. (observe que eu não devolvi o voto negativo por esse novo motivo). Mas entenda que você responde à pergunta errada. Eu acho que essa foi exatamente a razão por trás do outro voto negativo.
Michael Krelin - hacker
8
Também votei com o voto negativo, pois você não pode garantir que o fim do recebimento declarará & nbsp ;. Se você estiver trabalhando com xslt + html, sim, essa é uma maneira de fazê-lo, embora seja um hack. Mas, se você estiver usando o xslt para gerar outro xml, ele simplesmente explodirá em você.
Doug
14

Convém adicionar a definição para essa entidade no início do arquivo (abaixo da declaração xml):

<!DOCTYPE stylesheet [
<!ENTITY nbsp  "&#160;" >
]>

Além disso, você pode adicionar mais entidades como Ntilde, Aacute, etc.

Victor Hugo
fonte
5

Além da resposta de victor hugo , é possível obter todas as referências de caracteres conhecidas legalmente em um arquivo XSLT, assim:

<!DOCTYPE stylesheet [
  <!ENTITY % w3centities-f PUBLIC "-//W3C//ENTITIES Combined Set//EN//XML"
      "http://www.w3.org/2003/entities/2007/w3centities-f.ent">
  %w3centities-f;
]>
...
<xsl:text>&amp; &nbsp; &ndash;</xsl:text>

Também há certa diferença no resultado dessa abordagem em comparação com <xsl:text disable-output-escaping="yes">uma. O último produzirá literais de string como &nbsp;para todos os tipos de saída, mesmo para <xsl:output method="text">, e isso pode ser diferente do que você pode desejar ... Pelo contrário, obter entidades definidas para o modelo XSLT <!DOCTYPE ... <!ENTITY ...sempre produzirá saída consistente com suas xsl:outputconfigurações.

E ao incluir todas as referências de caracteres, pode ser aconselhável usar um resolvedor de entidade local para impedir que o mecanismo XSLT busque definições de entidade de caracteres da Internet. Usuários JAXP ou Xalan-J explícitos podem precisar de um patch para o Xalan-J usar o resolvedor corretamente. Veja meu blog XSLT, entidades, Java, Xalan ... para download de patch e comentários.

Sergey Ushakov
fonte
1
Observe que, recentemente, o W3 começou a bloquear muitas solicitações para aqueles e links semelhantes, se provenientes de um processo automatizado. Coloque esse arquivo localmente ou em seu servidor e ajuste a URL de acordo. Fora isso, +1 e excelente solução para usar entidades nomeadas em HTML.
Abel
Uma boa observação, e também há outro motivo para ter uma cópia local do arquivo com definições de entidade, pois caso contrário, o processo XSLT provavelmente falhará se a conexão à Internet não estiver disponível. No mundo Java, não há necessidade de hackear URLs, pois é possível organizar um EntityResolver , e o Apache XML Commons Resolver pode ser um bom candidato. Outras plataformas de programação são susceptíveis de ter técnicas semelhantes também ...
Sergey Ushakov
Sim, portanto, para referência, para o método abstrato dotnetters : ResolveEntity para entidades e XmlResolver carregar recursos externos , que são os equivalentes do .NET para esses métodos Java .
Abel
2

Quando você usa o seguinte (sem disable-output-escaping!), Você obtém um único espaço sem interrupção:

<xsl:text>&#160;</xsl:text>

Shaam
fonte
4
Você não precisa disable-output-escapingdisso
Ian Roberts
2

As folhas de estilo XSLT devem ser XML bem formado. Como "&nbsp;"não é uma das cinco entidades XML predefinidas , não pode ser incluída diretamente na folha de estilo. Portanto, retornar à sua solução "&#160;"é um substituto perfeito que "&nbsp;"você deve usar.

Exemplo:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/>
Adil
fonte
0

você também pode usar:

<xsl:value-of select="'&amp;nbsp'"/>

lembre-se do amplificador após o & ou você receberá uma mensagem de erro

Mattia Vio
fonte
Isso será exibido &amp;nbsp;(supondo que você pretenda que o ponto-e-vírgula esteja lá), que será renderizado como &nbsp;, e não como `` (nb-space).
Abel
0

Eu estava tentando exibir bordas em uma célula vazia em uma tabela HTML. Meu velho truque de usar espaço sem quebra em células vazias não estava funcionando no xslt. Eu usei quebra de linha com o mesmo efeito. Mencionei isso apenas no caso de você estar tentando usar o espaço ininterrupto para fornecer algum conteúdo a uma célula da tabela 'vazia' para ativar as bordas da célula.

<br/>
BH
fonte
Eu tenho um cenário semelhante, e isso parece funcionar para obter as células da tabela para renderizar.
Richard Moore
0

Tente usar

<xsl:text>&#160;</xsl:text>

Mas isso depende do processador XSLT que você está usando: a especificação XSLT não requer que os processadores XSLT a convertam em " &nbsp;".

Viacheslav
fonte
0

Embora a resposta já tenha sido fornecida por @brabster e outros.
Eu acho que uma solução mais reutilizável seria:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
Leonid Dashko
fonte