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


4 Answers

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

<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. На самом деле я склонен создавать переменные для запятых, цитат и новых строк.

Question

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




Вы можете использовать: <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:text> и литеральными символами новой строки, используя &#xA; ,

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

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

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




По моему опыту я заметил, что при создании новой строки 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;)




Я не мог просто использовать метод <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>





Related



Tags

xslt