символ - Создание новой строки в XSLT




переноса шаблонов (10)

Я хочу создать новую строку для вывода текста в XSLT. Есть идеи?


Answers

Включите атрибут Method = "text" в тег xsl: output и включите новые строки в ваш литеральный контент в XSL в соответствующих точках. Если вы предпочитаете сохранить исходный код вашего XSL-устройства, используйте объект 
 где вам нужна новая линия.


Я второй метод Ник Гибсон, это всегда было моим фаворитом:

<xsl:variable name='nl'><xsl:text>
</xsl:text></xsl:variable>

Однако я использовал задачу Ant <echoxml> для создания таблиц стилей и запуска их против файлов. Задача будет создавать шаблоны значений атрибутов, например $ {DSTAMP}, но также будет переформатировать ваш xml, поэтому в некоторых случаях ссылка на сущность предпочтительнее.

<xsl:variable name='nl'><xsl:text>&#xa;</xsl:text></xsl:variable>

Я нашел разницу между буквальными символами новой строки в <xsl:text> и литеральными символами новой строки, используя &#xA; ,

В то время как литературные новые строки отлично работали в моей среде (с использованием как Saxon, так и процессора Java XSLT по умолчанию), мой код не удался, когда он был выполнен другой группой, работающей в среде .NET.

Переход к объектам ( &#xA; ) заставил мой код генерации файлов работать последовательно на Java и .NET.

Кроме того, литеральные строки новой строки уязвимы для переформатирования IDE и могут непреднамеренно заблудиться, когда файл поддерживается кем-то «не в курсе».


Вы можете использовать: <xsl:text>&#10;</xsl:text>

см. пример

<xsl:variable name="module-info">
  <xsl:value-of select="@name" /> = <xsl:value-of select="@rev" />
  <xsl:text>&#10;</xsl:text>
</xsl:variable>

если вы пишете это в файле, например

<redirect:write file="temp.prop" append="true">
  <xsl:value-of select="$module-info" />
</redirect:write>

эта переменная создаст новую строку infile как:

commons-dbcp_commons-dbcp = 1.2.2
junit_junit = 4.4
org.easymock_easymock = 2.4

Мой предпочтительный метод для этого выглядит примерно так:

<xsl:stylesheet>

<xsl:output method='text'/>

<xsl:variable name='newline'><xsl:text>
</xsl:text></xsl:variable>

<!-- note that the layout there is deliberate -->

...

</xsl:stylesheet>

Затем, когда вы хотите вывести новую строку (возможно, в csv), вы можете вывести что-то вроде:

<xsl:value-of select="concat(elem1,elem2,elem3,$newline") />

Я использовал эту технику при выводе sql из ввода xml. На самом деле я склонен создавать переменные для запятых, цитат и новых строк.


Следующий XSL-код будет генерировать символ newline (строка):

<xsl:text>&#xa;</xsl:text>

Для возврата каретки используйте:

<xsl:text>&#xd;</xsl:text>

По моему опыту я заметил, что при создании новой строки INSIDE предложение <xsl:variable> не работает. Я пытался сделать что-то вроде:

<xsl:variable name="myVar">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My value: </xsl:text>
      <xsl:value-of select="@myValue" />
      <xsl:text></xsl:text> <!--NEW LINE-->
      <xsl:text>My other value: </xsl:text>
      <xsl:value-of select="@myOtherValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

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

Все, что я пытался вставить в эту «новую строку» (пустой узел <xsl:text> ), просто не работал (включая большинство более простых предложений на этой странице), не говоря уже о том, что HTML просто не будет работать там, так что в итоге мне пришлось разделить его на 2 переменные, вызвать их вне области <xsl:variable> и поставить между ними простой <br/> , то есть:

<xsl:variable name="myVar1">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My value: </xsl:text>
      <xsl:value-of select="@myValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

<xsl:variable name="myVar2">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My other value: </xsl:text>
      <xsl:value-of select="@myOtherValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

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

Да, я знаю, это не самое сложное решение, но оно работает, просто делясь своим разочарованием с XSLs;)


Я добавил директиву DOCTYPE вы видите здесь:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
  <!ENTITY nl "&#xa;">
]>
<xsl:stylesheet xmlns:x="http://www.w3.org/2005/02/query-test-XQTSCatalog"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="2.0">

Это позволяет мне использовать &nl; вместо &#xa; для создания новой строки на выходе. Как и другие решения, это обычно помещается внутри <xsl:text> .


Я не мог просто использовать метод <xsl:text>&#xa;</xsl:text> потому что, если я отформатирую XML-файл с помощью XSLT, объект исчезнет. Поэтому мне пришлось использовать несколько более крутой подход, используя переменные

<xsl:variable name="nl" select="'&#10;'"/>
<xsl:template match="/">
    <xsl:value-of select="$nl" disable-output-escaping="no"/>
    <xsl:apply-templates select="*"/>
</xsl:template>

В XSL существует несколько встроенных шаблонных правил , одним из которых является следующее:

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

Он выводит текст.





xslt