2008-10-08 14 views
12

que tienen una hoja de estilo XSL con el contenido en un nodo xsl:text así:Interpretación de líneas nuevas con xsl: texto?

<xsl:text> 
foo 
bar 
baz 
</xsl:text> 

La hoja de estilo en sí es un archivo de texto con "estilo UNIX" terminadores de línea de nueva línea. Invoco esta hoja de estilo en Windows, así como las plataformas unix. Sería bueno que el resultado se ajuste a las convenciones de la plataforma en la que se invoca.

Cuando ejecuto esta hoja de estilo en Windows, la salida tiene pares de retorno/nueva línea de transporte para todo, excepto los contenidos del nodo xsl:text.

¿Puedo indicar al procesador XSLT que traduzca los caracteres de nueva línea en el contenido del nodo xsl:text en fin de línea específico de la plataforma?

Más contexto: Estoy invocando la hoja de estilo de la Apache Ant 1.7.1 XSLT task así:

<xslt in="in.xml" out="out.xml" style="stylesheet.xsl"/> 

La cabecera de estilos Actualmente se ve así:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xalan="http://xml.apache.org/xslt" 
    exclude-result-prefixes="xalan"> 
    <!-- contents elided --> 
</xsl:stylesheet> 

Respuesta

1

No estoy seguro de cómo hacer la correcta salta automáticamente (puede depender del procesador xslt que esté utilizando), pero puede forzar las nuevas líneas en los contenidos de su nodo de texto. \ r \ n es &#xD; &#xA;, \ n es &#xA;, p. usaría:

<xsl:text>foo&#xD;&#xa;bar&#xD;&#xa;</xsl:text> para obtener el resultado que está buscando.

+0

¡Gracias por la respuesta! Sí, creo que podría hacerlo, ¡pero entonces la salida sería incorrecta en entornos de tipo Unix! En lugar de codificarlo de una manera u otra, quiero que "haga lo correcto" independientemente de dónde se invoque. Tal vez debería aclarar esto en la pregunta. Gracias de nuevo. –

5

Se podría definir un parámetro para la hoja de estilo, así:

<xsl:param name="br"> 
    <xsl:text>&#10;</xsl:text> 
</xsl:param> 

y pase el extremo apropiado del personaje (s) línea mediante el uso de un elemento PARAM anidado en el script Ant. El predeterminado en este ejemplo sería una nueva línea estilo Unix, por supuesto. Creo que para generar el valor, tendrías que usar:

<xsl:copy-of select="$br"/> 

Es detallado, pero funciona.

+0

¡Gracias por la respuesta! Esta es una buena idea, pero no creo que xsl: copy-of se pueda incrustar en el cuerpo de xsl: text. ¿Se puede definir una entidad con el param? Puedo incrustar cosas como <, ¿qué hay de &myeol;? ¿Cómo se hace eso? Idealmente, me gustaría una forma de hacer esto sin pasar EOL a través de un param. –

+0

¿Por qué tiene que estar dentro de xsl: text? ¿Por qué no unas pocas declaraciones jsight

4

Si se llama a la transformación de la hormiga, a continuación, you can test for the OS using a conditional task with a test for the OS family:

<condition property="linebreak" value="&#xD;&#xa;"> 
     <os family="windows"/> 
    </condition> 
    <condition property="linebreak" value="&#xa;"> 
     <os family="unix"/> 
    </condition> 

A continuación, pasar ese parámetro a la XSLT para señalar que el personaje (s) de nueva línea que desea utilizar.

<xslt in="data.xml" out="${out.dir}/out.xml"> 
    <param name="linebreak" expression="${linebreak}" /> 
</xslt> 
0

Bueno, yo tengo la mía para trabajar (utilizando sajona) con una combinación de 2 ideas anteriores:

<xsl:param name="br"> 
     <xsl:text>&#xD;&#xa;</xsl:text> 
</xsl:param> 

y luego usando la línea (s) como estos cuando sea necesario.

<xsl:value-of select="$br" /> 

Aquí es mi completa XSL (pero no engorda)

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!--<xsl:strip-space elements="*" />--> 
    <xsl:output method="text" /> 
    <!-- <xsl:preserve-space elements="*"/>--> 
<xsl:param name="br"> 
     <xsl:text>&#xD;&#xa;</xsl:text> 
</xsl:param> 


    <!-- --> 
    <xsl:template match="/"> 


    <xsl:for-each select="//root/Item"> 

     <xsl:value-of select="@Name" /> <!-- Your xpath will vary of course! --> 
     <xsl:value-of select="$br" /> 

    </xsl:for-each> 

</xsl:template> 

Una vez más, estoy usando Saxon % Archivos de programa% \ SaxonHE \ bin \ Transform.exe en un Windows 7 máquina x64.

Cuestiones relacionadas