Подтвердить что ты не робот

Интерпретация строк новой строки с помощью 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>
4b9b3361

Ответ 1

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

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

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

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

Это подробный, но он работает.

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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