Cómo insertar & nbsp; en XSLT

207

¿Cómo puedo insertar

 

En una hoja de estilo XSLT, sigo recibiendo este error:

Error de análisis XML: entidad indefinida

Esencialmente, quiero un carácter de espacio que no se rompa en la plantilla XSLT.

JL
fuente
2
También puedes usar & # xA0; igual a & # 160; mira aquí stackoverflow.com/questions/7511214/…
user3766111

Respuestas:

337

Usa el código de entidad   lugar.

 es una "referencia de entidad de caracteres" HTML. No hay una entidad con nombre para el espacio sin interrupción en XML, por lo que utiliza el código  .

Wikipedia incluye una lista de entidades XML y HTML , y puede ver que solo hay 5 "entidades predefinidas" en XML, pero HTML tiene más de 200. También señalaré Crear un espacio (& nbsp;) en XSL que tiene Excelentes respuestas.

brabster
fuente
3
Recientemente nos encontramos con una situación en la que solo uno de los muchos XSL dejó de funcionar con esta técnica y comenzó a mostrar un personaje extraño. Sin embargo, si uso la técnica CDATA de WaterSoul, funciona.
@BrianReindel, eso probablemente significa que usó la referencia de entidad numérica incorrecta, es decir, en Šlugar de  la última, que siempre se resolverá en un espacio Unicode sin interrupción.
Abel
El enlace Top Ten Java and XSLT Tips es realmente útil.
LCJ
<xsl: text> & # 160; </ xsl: text>
separa
1
El enlace se ha podrido.
GSerg
37

&#160;funciona muy bien Sin embargo, mostrará uno de esos caracteres extraños en la codificación ANSI. <xsl:text>funcionó mejor para mí

<xsl:text> </xsl:text>
Saroj
fuente
3
Usando la respuesta aceptada, terminé con un espacio de salto de línea en mi salida XML (al menos eso es lo que parecía en el editor XML de VS2010). Usando esta respuesta, obtengo exactamente 1 espacio solo.
Mathijs Flietstra
1
@ Matthijs, este es un espacio, no un espacio sin interrupciones, que no es lo mismo. Si VS lo muestra incorrectamente, verifique su codificación (VS es perfectamente capaz de mostrar esto correctamente y debería ser una codificación independiente, por lo que es más probable que esté haciendo algo más mal).
Abel
25

También se puede hacer esto:

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>
Alma de agua
fuente
2
Esto funcionará si el procesador es compatibledisable-output-escaping , lo cual no es necesario y fue desaprobado en XSLT 2.0 y más en 3.0. En estas versiones, puede alcanzar el mismo efecto con xsl:character-mapprocesador cruzado garantizado para trabajar. Además, esto coloca una entidad con nombre &nbsp;en la salida, que no es necesariamente lo mismo que un espacio sin interrupción y el extremo receptor debe tener esta entidad declarada (en HTML generalmente es implícita).
Abel
21

Utilizar este

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

editar: los downvoters probablemente deberían validar que esto funciona primero (lo hace, y es la solución más general al problema).

jagprinderdeep
fuente
1
No estoy seguro, pero he probado mi enfoque y funciona, así que no estoy seguro de para qué fue el
voto negativo
2
Además, la respuesta aceptada no será válida para todos los analizadores de acuerdo con la página vinculada; sólo un
aviso
1
He dado la razón de mi voto negativo antes, pero si tuviera que votar negativamente esta respuesta, entonces la razón sería: responde a la pregunta incorrecta. El OP claramente le preguntó cómo poner un espacio no rompible, usando xslt y usted respondió cómo poner una secuencia de punto y coma ampersand-nbsp. Y las disputas por votos negativos también son desagradables. Pero en serio, ¿nunca has dicho eso sobre CDATA?
Michael Krelin - hacker
1
De acuerdo, jagprinderdeep, revoco mi voto negativo, pero a cambio, ve a visitarme una vez que llegue al manicomio. (tenga en cuenta que no le devuelvo el voto negativo por esa nueva razón). Pero entienda que responde la pregunta incorrecta. Creo que esa fue exactamente la razón detrás del otro voto negativo.
Michael Krelin - hacker
8
También voté en contra, ya que no puede garantizar que el receptor recibirá & nbsp ;. Si está trabajando con xslt + html, entonces sí, esta es una forma de hacerlo, aunque sea un truco. Pero, si está usando xslt para generar otro xml, entonces simplemente explotará.
Doug
14

Es posible que desee agregar la definición de esta entidad al comienzo del archivo (debajo de la declaración xml):

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

También puede agregar más entidades como Ntilde, Aacute, etc.

Victor Hugo
fuente
5

Además de la respuesta de victor hugo, es posible obtener todas las referencias de caracteres conocidas legales en un archivo XSLT, como este:

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

También hay cierta diferencia en el resultado de este enfoque en comparación con <xsl:text disable-output-escaping="yes">uno. Este último producirá literales de cadena como &nbsp;para todo tipo de salida, incluso para <xsl:output method="text">, y esto puede ser diferente de lo que desee ... Por el contrario, obtener entidades definidas para la plantilla XSLT a través de <!DOCTYPE ... <!ENTITY ...siempre producirá resultados consistentes con su xsl:outputconfiguración

Y cuando se incluyen todas las referencias de caracteres, puede ser conveniente utilizar un resolutor de entidad local para evitar que el motor XSLT obtenga definiciones de entidad de caracteres de Internet. Los usuarios de JAXP o Xalan-J explícitos pueden necesitar un parche para que Xalan-J use el resolutor correctamente. Vea mi blog XSLT, entidades, Java, Xalan ... para descargar parches y comentarios.

Sergey Ushakov
fuente
1
Tenga en cuenta que recientemente, W3 comenzó a bloquear demasiadas solicitudes a esos y enlaces similares si proviene de un proceso automatizado. Coloque ese archivo localmente o en su servidor y ajuste la URL en consecuencia y debería estar bien. Aparte de eso, +1, y una excelente solución para usar entidades con nombre HTML.
Abel
Una buena nota, y también hay otra razón para tener una copia local del archivo con definiciones de entidad, ya que de lo contrario es probable que el proceso XSLT falle si la conexión a Internet no está disponible. En el mundo de Java no hay necesidad de hackear URL, ya que es posible organizar un EntityResolver , y Apache XML Commons Resolver puede ser un buen candidato. Es probable que otras plataformas de programación también tengan técnicas similares ...
Sergey Ushakov
Sí, para referencia, para los dotnetters: método abstracto ResolveEntity para entidades y XmlResolver para cargar recursos externos , que son los equivalentes .NET para estos métodos Java .
Abel
2

Cuando use lo siguiente ( disable-output-escaping¡ sin !) Obtendrá un espacio único que no se rompe:

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

Shaam
fuente
44
No es necesario disable-output-escapingpara esto
Ian Roberts
2

Las hojas de estilo XSLT deben ser XML bien formadas. Como "&nbsp;"no es una de las cinco entidades XML predefinidas , no se puede incluir directamente en la hoja de estilo. Así que volver a su solución "&#160;"es un reemplazo perfecto de"&nbsp;" que debe usar.

Ejemplo:

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

también puedes usar:

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

recuerde el amplificador después de & o recibirá un mensaje de error

Mattia Vio
fuente
Esto generará &amp;nbsp;(suponiendo que pretendía que el punto y coma estuviera allí), que se representará como &nbsp;, no como `` (nb-space).
Abel
0

Estaba tratando de mostrar bordes en una celda vacía en una tabla HTML. Mi viejo truco de usar espacio que no se rompe en celdas vacías no funcionaba desde xslt. Usé salto de línea con el mismo efecto. Menciono esto solo en caso de que la razón por la que intentabas usar el espacio sin interrupción fuera para dar algo de contenido a una celda de tabla 'vacía' para activar los bordes de la celda.

<br/>
BH
fuente
Tengo un escenario similar, y esto parece funcionar para hacer que las celdas de la tabla se procesen.
Richard Moore
0

Tratar de usar

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

Pero depende del procesador XSLT que esté utilizando: la especificación XSLT no requiere procesadores XSLT para convertirlo en " &nbsp;".

Viacheslav
fuente
0

Aunque la respuesta ya ha sido proporcionada por @brabster y otros.
Creo que una solución más reutilizable sería:

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