Интерпретировать переводы строк с помощью xsl: text? - PullRequest
13 голосов
/ 09 октября 2008

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

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

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

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

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

Больше контекста: я вызываю таблицу стилей из XSLT-задачи Apache Ant 1.7.1 следующим образом:

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

Ответы [ 4 ]

5 голосов
/ 09 октября 2008

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

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

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

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

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

4 голосов
/ 10 октября 2008

Если вы вызываете преобразование из Ant, тогда вы можете протестировать для ОС, используя условное задание с тестом для семейства ОС :

  <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>
1 голос
/ 09 октября 2008

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

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

0 голосов
/ 29 апреля 2011

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

<xsl:param name="br">
        <xsl:text>&#xD;&#xa;</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>&#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>

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

...