Создание простой HTML-таблицы с помощью XSLT

#xml #xslt #xpath

#xml #xslt #xpath

Вопрос:

Я использую XSLT для создания HTML-таблицы с использованием информации из XML-файла. Я хочу только 4 TD в каждом TR.

Он отлично работает в Chrome и Safari. Не в Firefox. Я понимаю, что Firefox не поддерживает ‘disable-output-escape’, поэтому я знаю, что это проблема (она просто записывается на веб-странице). Есть ли другой способ сгенерировать такую (простую) таблицу с помощью XSLT на стороне клиента?

Мой код выглядит так:

 <table>
<xsl:for-each select="movies/movie">
   <xsl:if test="(position() = 1) or ((position() mod 4) = 1)">
       <!-- This is a <tr> -->
      <xsl:text disable-output-escaping="yes">amp;<tramp;></xsl:text>
   </xsl:if>
   <td>
     <!-- Some stuff goes here. -->
   </td>
   <xsl:if test="((position() mod 4) = 0) or (position() = last())">
       <!-- This is a </tr> -->
      <xsl:text disable-output-escaping="yes">amp;</tramp;></xsl:text>
   </xsl:if> 
</xsl:for-each>
</table>
 

Комментарии:

1. Можете ли вы опубликовать образец XML, который вы преобразуете?

Ответ №1:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <table>
      <xsl:apply-templates select="movies/movie[position() mod 4 = 1]"/>
    </table>
  </xsl:template>

  <xsl:template match="movie">
    <tr>
      <xsl:for-each select=". | following-sibling::movie[position() amp;< 4]">
        <td>
          <xsl:value-of select="."/>
        </td>
      </xsl:for-each>
    </tr>
  </xsl:template>

</xsl:stylesheet>
 

Введите XML:

 <movies>
  <movie>a</movie>
  <movie>b</movie>
  <movie>c</movie>
  <movie>d</movie>
  <movie>e</movie>
  <movie>f</movie>
  <movie>g</movie>
  <movie>h</movie>
</movies>
 

Вывод XML:

 <table>
  <tr>
    <td>a</td>
    <td>b</td>
    <td>c</td>
    <td>d</td>
  </tr>
  <tr>
    <td>e</td>
    <td>f</td>
    <td>g</td>
    <td>h</td>
  </tr>
</table>
 

Комментарии:

1. Спасибо! Это должен быть способ XSLT 🙂

Ответ №2:

Вы пробовали что-то подобное?

 <table>
<tr><xsl:apply-templates select='movies/movie' /></tr>
</table>
 

А затем в другом шаблоне

 <xsl:template match='movie'>
   <td><xsl:value-of select='.' /></td>
</xsl>
 

Помните, что вы должны попытаться думать о XSLT как о системе шаблонов, а не как о языке программирования. Использование специфичных для XSLT конструкций обычно проще, чем пытаться перевести другие конструкции.