2008-10-08 7 views
12

У меня есть XSL таблицу стилей с содержанием в качестве xsl:text узла, как это:Интерпретация строк новой строки с xsl: text?

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

Сама таблица стилей представляет собой текстовый файл с «Unix-стиле» новой строки терминаторов линии. Я вызываю эту таблицу стилей как в Windows, так и в Unix-подобных платформах. Было бы неплохо, чтобы результат соответствовал соглашениям платформы, на которых он вызывается.

Когда я запускаю эту таблицу стилей в Windows, на выходе есть пары возврата/новой строки для всех кроме содержимое узла xsl:text.

Могу ли я поручить процессору XSLT преобразовывать символы новой строки в содержимое узла xsl:text в конкретные концевые линии платформы?

Больше контекста: Я вызова таблицы стилей из Apache Ant 1.7.1 XSLT task как это:

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

Заголовок таблицы стилей в настоящее время выглядит следующим образом:

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

ответ

1

Я не уверен, как это сделать правильно newlines автоматически (это может зависеть от процессора xslt, который вы используете), но вы можете заставить строки новой строки в содержимом вашего текстового узла. \ r \ n - &#xD; &#xA;, \ n - &#xA;, т.е. вы должны использовать:

<xsl:text>foo&#xD;&#xa;bar&#xD;&#xa;</xsl:text> чтобы получить вывод, который вы ищете.

+0

Спасибо за ответ! Да, я думаю, что я мог бы это сделать, но тогда выход был бы неправильным в unix-подобных средах! Вместо того, чтобы жестко кодировать его так или иначе, я хочу, чтобы он «делал правильную вещь» независимо от того, где он вызывается. Может быть, я должен прояснить это в вопросе. Еще раз спасибо. – 2008-10-08 22:53:02

5

Вы можете задать параметр для таблицы стилей следующим образом:

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

и передать в соответствующем конце строки символа (ы) с помощью вложенного элемента паров в скрипте. Значение по умолчанию в этом примере было бы, конечно, новой строкой в ​​стиле Unix. Я думаю, чтобы вывести стоимость, вам придется использовать:

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

Это многословие, но оно работает.

+0

Спасибо за ответ! Это хорошая идея, но я не думаю, что xsl: copy-in может быть встроен в тело xsl: text. Может ли сущность быть определена с параметром? Я могу вставлять такие вещи, как <, а как насчет &myeol;? Как это делается? В идеале я бы хотел сделать это, не пройдя EOL через параметр. – 2008-10-09 16:35:50

4

Если вы вызываете преобразование из Ant, затем 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> 

Затем передайте этот параметр в XSLT, чтобы сигнализировать, который символ новой строки (ы) вы хотите использовать.

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

Ну, я получил мое работать (используя Saxon) с комбинацией 2 идей выше:

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

, а затем с помощью линии (ы), как их там, где это необходимо.

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

Вот мой полный (но Slimline) XSL

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

Опять же, я использую Saxon % ProgramFiles% \ SaxonHE \ Bin \ Transform.exe на через окна 7 x64.

Смежные вопросы