Интерпретация строк новой строки с помощью xsl: text?
У меня есть таблица стилей XSL с содержимым в xsl:text
node следующим образом:
<xsl:text>
foo
bar
baz
</xsl:text>
Сама таблица стилей представляет собой текстовый файл с терминами линии новой строки в стиле unix. Я вызываю эту таблицу стилей как в Windows, так и в Unix-подобных платформах. Было бы неплохо, чтобы результат соответствовал соглашениям платформы, на которых он вызывается.
Когда я запускаю эту таблицу стилей в Windows, на выходе есть пары возврата каретки/новой строки для всего, кроме содержимого xsl:text
node.
Могу ли я дать указание процессору XSLT перевести символы новой строки в содержимом xsl:text
node в конце конца строки на платформе?
Больше контекста: я вызываю таблицу стилей из Apache Ant 1.7.1 задача XSLT следующим образом:
<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
Вы можете определить параметр для таблицы стилей следующим образом:
<xsl:param name="br">
<xsl:text> </xsl:text>
</xsl:param>
и передать соответствующий символ конца строки, используя вложенный элемент param в Ant script. Значение по умолчанию в этом примере было бы, конечно, новой строкой в стиле Unix. Я думаю, чтобы вывести значение, вам придется использовать:
<xsl:copy-of select="$br"/>
Это подробный, но он работает.
Ответ 2
Если вы вызываете преобразование из Ant, то вы можете протестировать для ОС с помощью условной задачи с тестом на семейство ОС:
<condition property="linebreak" value="
">
<os family="windows"/>
</condition>
<condition property="linebreak" value="
">
<os family="unix"/>
</condition>
Затем передайте этот параметр в XSLT, чтобы сигнализировать, какой символ (-ы) новой строки вы хотите использовать.
<xslt in="data.xml" out="${out.dir}/out.xml">
<param name="linebreak" expression="${linebreak}" />
</xslt>
Ответ 3
Я не уверен, как делать правильные новые строки автоматически (это может зависеть от используемого вами процессора xslt), но вы можете заставить строки новой строки в содержимом вашего текста node.\r\n 
 

,\n - 

, например. вы должны использовать:
<xsl:text>foo
bar
</xsl:text>
, чтобы получить результат, который вы ищете.
Ответ 4
Ну, я получил свою работу (используя саксонскую) с комбинацией из двух идей выше:
<xsl:param name="br">
<xsl:text>
</xsl:text>
</xsl:param>
а затем используя строки (-ы), подобные этим, когда это необходимо.
<xsl:value-of select="$br" />
Вот моя полная (но тонкая) 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>
</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>
Опять же, я использую саксонскую
% ProgramFiles%\SaxonHE\Bin\Transform.exe
на машине Windows 7 x64.