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.
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.
Respostas:
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.
Š
vez da  
última, que sempre será resolvida para um espaço sem quebra de Unicode.
 
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>
Pode-se também fazer isso:
<xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
disable-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-map
garantia de trabalhar com vários processadores. Além disso, isso coloca uma entidade nomeada
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).
Usa isto
<xsl:text disable-output-escaping="yes">&</xsl:text>nbsp;
edit: Downvoters provavelmente devem validar que isso funcione primeiro (funciona e é a solução mais geral para o problema).
Convém adicionar a definição para essa entidade no início do arquivo (abaixo da declaração xml):
<!DOCTYPE stylesheet [
<!ENTITY nbsp " " >
]>
Além disso, você pode adicionar mais entidades como Ntilde, Aacute, etc.
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>& –</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
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:output
configuraçõ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.
Quando você usa o seguinte (sem disable-output-escaping
!), Você obtém um único espaço sem interrupção:
<xsl:text> </xsl:text>
disable-output-escaping
disso
As folhas de estilo XSLT devem ser XML bem formado. Como " "
não é uma das cinco entidades XML predefinidas , não pode ser incluída diretamente na folha de estilo. Portanto, retornar à sua solução " "
é um substituto perfeito que " "
você deve usar.
Exemplo:
<xsl:value-of select="$txtFName"/> <xsl:value-of select="$txtLName"/>
você também pode usar:
<xsl:value-of select="'&nbsp'"/>
lembre-se do amplificador após o & ou você receberá uma mensagem de erro
&nbsp;
(supondo que você pretenda que o ponto-e-vírgula esteja lá), que será renderizado como
, e não como `` (nb-space).
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/>
Tente usar
<xsl:text> </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 "
".
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"> </xsl:variable>
...
<xsl:value-of select="$space"/>