Come inserire & nbsp; in XSLT


207

Come posso inserire

 

In un foglio di stile XSLT, continuo a ricevere questo errore:

Errore di analisi XML: entità non definita

Fondamentalmente voglio un carattere spaziale non interrotto nel modello XSLT.


2
Puoi anche usare & # xA0; lo stesso di & # 160; guarda qui stackoverflow.com/questions/7511214/...
user3766111

Risposte:


337

Usa il codice entità   invece il .

 è un "riferimento entità carattere" HTML. Non esiste un'entità denominata per lo spazio non-breaking in XML, quindi si utilizza il codice  .

Wikipedia include un elenco di entità XML e HTML e puoi vedere che ci sono solo 5 "entità predefinite" in XML, ma HTML ha oltre 200. Indicherò anche la creazione di uno spazio (& nbsp;) in XSL che ha risposte eccellenti.


3
Di recente ci siamo imbattuti in una situazione in cui in una sola delle tante XSL ha smesso di funzionare con questa tecnica e abbiamo iniziato a mostrare uno strano personaggio. Tuttavia, se uso la tecnica CDATA di WaterSoul, funziona.

@BrianReindel, ciò probabilmente significa che hai usato il riferimento di entità numerica errato, ovvero Šinvece di  quest'ultimo, che si risolverà sempre in uno spazio non-break Unicode.
Abele,

Il collegamento Top Ten Suggerimenti Java e XSLT è davvero utile.
LCJ,

<xsl: text> & # 160; </ xsl: text> separa i due campi
Manash Ranjan Dakua

1
Il collegamento è marcito.
GSerg

37

&#160;funziona davvero bene. Tuttavia, mostrerà uno di quegli strani personaggi nella codifica ANSI. <xsl:text>ha funzionato meglio per me.

<xsl:text> </xsl:text>

3
Usando la risposta accettata ho finito con uno spazio di interruzione di riga nel mio output XML (almeno è quello che sembrava nell'editor XML di VS2010). Usando questa risposta ottengo esattamente 1 solo spazio.
Mathijs Flietstra,

1
@Matthijs, questo è uno spazio, non uno spazio non-break, che non è lo stesso. Se VS lo mostra in modo errato, controlla la tua codifica (VS è perfettamente in grado di mostrarlo correttamente e dovrebbe essere codificato in modo indipendente, quindi più probabilmente stavi facendo qualcosa di sbagliato).
Abele,

25

Si può anche fare questo:

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>

2
Funzionerà se il processore supportadisable-output-escaping , cosa che non è richiesta ed è stato deprecato in XSLT 2.0 e più in 3.0. In queste versioni è possibile ottenere lo stesso effetto con il xsl:character-mapfunzionamento multiprocessore garantito. Inoltre, questo posiziona un'entità denominata &nbsp;nell'output, che non è necessariamente uguale a uno spazio non interrotto e l'estremità ricevente deve avere questa entità dichiarata (in HTML è di solito implicitamente).
Abele,

21

Usa questo

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

modifica: i downvoter dovrebbero probabilmente verificare che funzioni prima (funziona ed è la soluzione più generale al problema).


1
Non sono sicuro, ma ho testato il mio approccio e funziona, quindi non sono sicuro a cosa servisse il downvote :(
jagprinderdeep

2
Inoltre, la risposta accettata non sarà valida per tutti i parser in base alla pagina collegata; solo un
avvertimento

1
Ho già dato la ragione del mio downvote in precedenza, ma se dovessi sottovalutare questa risposta, allora il motivo sarebbe: risponde alla domanda sbagliata. L'OP ha chiaramente chiesto come mettere nello spazio non frangibile, usando xslt e tu hai risposto come mettere la sequenza e commerciale-nbsp-punto e virgola. E litigare per i voti negativi è anche inutile. Ma seriamente, non l'hai mai detto su CDATA?
Michael Krelin - hacker,

1
Ok, sospiro, revoco il mio voto negativo, ma in cambio, per favore, vieni a trovarmi una volta colpito il manicomio. (nota che non ti restituisco il voto negativo per quel nuovo motivo). Ma capisci che rispondi alla domanda sbagliata. Penso che fosse esattamente il motivo dietro l'altro downvote.
Michael Krelin - hacker,

8
Ho anche effettuato il downgrade poiché non puoi garantire che la parte ricevente dichiarerà & nbsp ;. Se stai lavorando con xslt + html, allora sì, questo è un modo per farlo, anche se un hack. Ma, se stai usando xslt per generare altri xml, ti farà esplodere.
Doug,

14

Potresti voler aggiungere la definizione per questa entità all'inizio del file (sotto la dichiarazione xml):

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

Inoltre puoi aggiungere più entità come Ntilde, Aacute, ecc.


5

Oltre alla risposta di Victor Hugo, è possibile ottenere tutti i riferimenti a personaggi noti legali in un file XSLT, in questo modo:

<!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>

C'è anche una certa differenza nel risultato di questo approccio rispetto a <xsl:text disable-output-escaping="yes">uno. Quest'ultimo produrrà valori letterali di stringa come &nbsp;per tutti i tipi di output, anche per <xsl:output method="text">, e questo potrebbe essere diverso da quello che potresti desiderare ... Al contrario, ottenere entità definite per il modello XSLT <!DOCTYPE ... <!ENTITY ...produrrà sempre un output coerente con il tuoxsl:output impostazioni.

E quando si includono tutti i riferimenti ai caratteri, potrebbe essere saggio utilizzare un risolutore di entità locale per impedire al motore XSLT di recuperare le definizioni delle entità dei caratteri da Internet. Gli utenti JAXP o espliciti Xalan-J potrebbero aver bisogno di una patch per Xalan-J per utilizzare correttamente il resolver. Vedi il mio blog XSLT, entità, Java, Xalan ... per scaricare patch e commenti.


1
Si noti che di recente, W3 ha iniziato a bloccare troppe richieste a tali e collegamenti simili se provenienti da un processo automatizzato. Posiziona quel file localmente o sul tuo server e regola l'URL di conseguenza e dovresti andare bene. Oltre a ciò, +1 e un'ottima soluzione per utilizzare entità con nome HTML.
Abele,

Una buona nota e c'è anche un altro motivo per avere una copia locale del file con le definizioni delle entità, altrimenti il ​​processo XSLT potrebbe non riuscire se la connessione Internet non è disponibile. Nel mondo Java non è necessario hackerare gli URL, in quanto è possibile organizzare un EntityResolver e Apache XML Commons Resolver potrebbe essere un buon candidato. È probabile che anche altre piattaforme di programmazione abbiano tecniche simili ...
Sergey Ushakov,

Sì, quindi per riferimento, per i dotnetter: metodo astratto ResolveEntity per le entità e XmlResolver per caricare risorse esterne , che sono gli equivalenti .NET per questi metodi Java .
Abele,

2

Quando usi il seguente (senza disable-output-escaping!) Otterrai un unico spazio non-break:

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


4
Non è necessario disable-output-escapingper questo
Ian Roberts

2

I fogli di stile XSLT devono essere XML ben formati. Poiché "&nbsp;"non è una delle cinque entità XML predefinite , non può essere inclusa direttamente nel foglio di stile. Quindi tornare alla tua soluzione "&#160;"è un perfetto sostituto di"&nbsp;" che dovresti usare.

Esempio:

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

0

puoi anche usare:

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

ricorda l'amplificatore dopo il & o riceverai un messaggio di errore


Questo produrrà &amp;nbsp;(supponendo che tu abbia intenzione di essere punto e virgola essere lì), che renderà come &nbsp;, non come `` (nb-spazio).
Abele,

0

Stavo cercando di visualizzare i bordi su una cella vuota in una tabella HTML. Il mio vecchio trucco di utilizzare lo spazio non-break in celle vuote non funzionava da xslt. Ho usato l'interruzione di linea con lo stesso effetto. Lo dico nel caso in cui il motivo per cui stavi cercando di utilizzare lo spazio non-break fosse quello di dare del contenuto a una cella di tabella "vuota" per attivare i bordi delle celle.

<br/>

Ho uno scenario simile e questo sembra funzionare nel rendere le celle della tabella per il rendering.
Richard Moore,

0

Prova ad usare

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

Ma dipende dal processore XSLT che stai utilizzando: le specifiche XSLT non richiedono processori XSLT per convertirlo in " &nbsp;".


0

Sebbene la risposta sia già stata fornita da @brabster e altri.
Penso che una soluzione più riutilizzabile sarebbe:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.