transformar online example xslt

example - xslt online



Produciendo una nueva lĂ­nea en XSLT (11)

Quiero producir una nueva línea para salida de texto en XSLT. ¿Algunas ideas?


Desde mi experiencia, he notado que producir una nueva línea DENTRO de una cláusula <xsl:variable> no funciona. Intentaba hacer algo como:

<xsl:variable name="myVar"> <xsl:choose> <xsl:when test="@myValue != ''''"> <xsl:text>My value: </xsl:text> <xsl:value-of select="@myValue" /> <xsl:text></xsl:text> <!--NEW LINE--> <xsl:text>My other value: </xsl:text> <xsl:value-of select="@myOtherValue" /> </xsl:when> </xsl:choose> <xsl:variable> <div> <xsl:value-of select="$myVar"/> </div>

Todo lo que traté de poner en esa "nueva línea" (el nodo vacío <xsl:text> ) simplemente no funcionó (incluyendo la mayoría de las sugerencias más simples en esta página), sin mencionar el hecho de que HTML simplemente no funcionará allí, así que finalmente tuve que dividirlo en 2 variables, llamarlos fuera del alcance <xsl:variable> y poner un simple <br/> entre ellos, es decir:

<xsl:variable name="myVar1"> <xsl:choose> <xsl:when test="@myValue != ''''"> <xsl:text>My value: </xsl:text> <xsl:value-of select="@myValue" /> </xsl:when> </xsl:choose> <xsl:variable> <xsl:variable name="myVar2"> <xsl:choose> <xsl:when test="@myValue != ''''"> <xsl:text>My other value: </xsl:text> <xsl:value-of select="@myOtherValue" /> </xsl:when> </xsl:choose> <xsl:variable> <div> <xsl:value-of select="$myVar1"/> <br/> <xsl:value-of select="$myVar2"/> </div>

Sí, lo sé, no es la solución más sofisticada, pero funciona, solo compartir mi experiencia de frustración con XSL;)


El siguiente código XSL producirá un newline línea (avance de línea):

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

Para un retorno de carro , use:

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


En mi humilde opinión, no se necesita más información que la de @Florjon. Quizás algunos pequeños detalles se dejen de entender por qué a veces no nos funciona.

Antes que nada, el &#xa (hex) o &#10 (dec) dentro de un <xsl:text/> siempre funcionará, pero es posible que no lo veas.

  1. No hay línea nueva en un marcado HTML. Usar un simple <br/> te irá bien. De lo contrario, verá un espacio en blanco. Ver la fuente desde el navegador le dirá lo que realmente sucedió. Sin embargo, hay casos en los que espera este comportamiento, especialmente si el consumidor no es directamente un navegador. Por ejemplo, desea crear una página HTML y ver su estructura formateada muy bien con líneas vacías e identificadores antes de servirla en el navegador.
  2. Recuerde dónde necesita usar disable-output-escaping y dónde no. Tome el siguiente ejemplo donde tuve que crear un xml de otro y declarar su DTD desde una hoja de estilo.

La primera versión escapa de los caracteres (por defecto para xsl: texto)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" encoding="utf-8"/> <xsl:template match="/"> <xsl:text>&lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt;&#xa;&#xa;&#xd;</xsl:text> <xsl:copy> <xsl:apply-templates select="*" mode="copy"/> </xsl:copy> </xsl:template> <xsl:template match="@*|node()" mode="copy"> <xsl:copy> <xsl:apply-templates select="@*|node()" mode="copy"/> </xsl:copy> </xsl:template> </xsl:stylesheet>

y aqui esta el resultado:

<?xml version="1.0" encoding="utf-8"?> &lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt; &#13;<Subscriptions> <User id="1"/> </Subscriptions>

Ok, hace lo que esperamos, se hace el escape para que los caracteres que utilizamos se muestren correctamente. El formato de parte XML dentro del nodo raíz es manejado por ident="yes" . Pero con una mirada más cercana , vemos que el carácter de nueva línea &#xa no se escapó y se tradujo tal cual, ¡realizando un doble salto de línea! No tengo una explicación sobre esto, será bueno saberlo. ¿Nadie?

La segunda versión no escapa a los personajes, por lo que están produciendo para lo que están destinados. El cambio realizado fue:

<xsl:text disable-output-escaping="yes">&lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt;&#xa;&#xa;&#xd;</xsl:text>

y aqui esta el resultado:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"> <Subscriptions> <User id="1"/> </Subscriptions>

y eso estará bien. Tanto cr como lf son renderizados apropiadamente.

  1. No olvide que estamos hablando de nl , no crlf ( nl=lf ). Mi primer intento fue usar solo cr: &#xd y mientras que el xml de salida fue validado por DOM correctamente.

Estaba viendo un xml corrupto:

<?xml version="1.0" encoding="utf-8"?> <Subscriptions>riptions SYSTEM "Subscriptions.dtd"> <User id="1"/> </Subscriptions>

El analizador DOM ignoró los caracteres de control pero el renderizado no lo hizo. ¡Pasé bastante tiempo golpeando mi cabeza antes de darme cuenta de lo tonto que no estaba viendo esto!

Para el registro, utilizo una variable dentro del cuerpo con ambos CRLF solo para estar 100% seguro de que funcionará en todas partes.


He encontrado una diferencia entre nuevas líneas literales en <xsl:text> y nuevas líneas literales usando &#xA; .

Mientras que las nuevas líneas literales funcionaban bien en mi entorno (utilizando tanto Saxon como el procesador Java XSLT predeterminado) mi código falló cuando fue ejecutado por otro grupo que se ejecutaba en un entorno .NET.

Al cambiar a entidades ( &#xA; ) mi código de generación de archivos se ejecutó consistentemente tanto en Java como en .NET.

Además, las nuevas líneas literales son vulnerables a ser formateadas por los IDEs y pueden perderse inadvertidamente cuando el archivo es mantenido por alguien "no informado".


Incluya el atributo Method = "text" en la etiqueta xsl: output e incluya nuevas líneas en su contenido literal en el XSL en los puntos apropiados. Si prefiere mantener el código fuente de su XSL ordenado, use la entidad &#10; donde quieres una nueva linea


Mi método favorito para hacer esto se parece a algo así como:

<xsl:stylesheet> <xsl:output method=''text''/> <xsl:variable name=''newline''><xsl:text> </xsl:text></xsl:variable> <!-- note that the layout there is deliberate --> ... </xsl:stylesheet>

Luego, cada vez que quiera generar una nueva línea (quizás en csv), puede generar algo como:

<xsl:value-of select="concat(elem1,elem2,elem3,$newline") />

He utilizado esta técnica al generar SQL desde la entrada xml. De hecho, tiendo a crear variables para comas, comillas y nuevas líneas.


No podía usar el enfoque <xsl:text>&#xa;</xsl:text> porque si formateo el archivo XML con XSLT, la entidad desaparecerá. Entonces tuve que usar un enfoque un poco más redondo usando variables

<xsl:variable name="nl" select="''&#10;''"/> <xsl:template match="/"> <xsl:value-of select="$nl" disable-output-escaping="no"/> <xsl:apply-templates select="*"/> </xsl:template>


Puede usar: <xsl:text>&#10;</xsl:text>

mira el ejemplo

<xsl:variable name="module-info"> <xsl:value-of select="@name" /> = <xsl:value-of select="@rev" /> <xsl:text>&#10;</xsl:text> </xsl:variable>

si escribe esto en un archivo, por ejemplo

<redirect:write file="temp.prop" append="true"> <xsl:value-of select="$module-info" /> </redirect:write>

esta variable producirá un nuevo infile de línea como:

commons-dbcp_commons-dbcp = 1.2.2 junit_junit = 4.4 org.easymock_easymock = 2.4


Seguí el método de Nic Gibson, este siempre fue mi favorito:

<xsl:variable name=''nl''><xsl:text> </xsl:text></xsl:variable>

Sin embargo, he estado usando la tarea Ant <echoxml> para crear hojas de estilo y ejecutarlas contra archivos. La tarea tendrá plantillas de valor de atributo, por ejemplo, $ {DSTAMP}, pero también formateará su xml, por lo que en algunos casos, la referencia de entidad es preferible.

<xsl:variable name=''nl''><xsl:text>&#xa;</xsl:text></xsl:variable>


solo agrega esta etiqueta:

<br/>

esto funciona para mi ;) .


DOCTYPE directiva DOCTYPE que ves aquí:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xsl:stylesheet [ <!ENTITY nl "&#xa;"> ]> <xsl:stylesheet xmlns:x="http://www.w3.org/2005/02/query-test-XQTSCatalog" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

Esto me permite usar &nl; en lugar de &#xa; para producir una nueva línea en la salida. Al igual que otras soluciones, esto normalmente se ubica dentro de una etiqueta <xsl:text> .