Поместить содержимое XML в четыре HTML-блока

#xslt

#xslt

Вопрос:

У меня есть несколько тегов XML, которые я хочу разместить в четырех блоках (divs).

Входные данные следующие:

 <product>
  <product1>1</product1>
  <product2>2</product2>
  <product3>3</product3>
  <product4>4</product4>
  <product5>5</product5>
  <product6>6</product6>
  <product7>7</product7>
  <product8>8</product8>
</product>
  

Результат, который я пытаюсь получить, это:

 <div><span>1</span> <span>5</span></div>
<div><span>2</span> <span>6</span></div>
<div><span>3</span> <span>7</span></div>
<div><span>4</span> <span>8</span></div>
  

Вот ссылка на изображение того, что я пытаюсь получить http://clip2net.com/s/1fON5

Таблицы здесь не подойдут, так как мне нужны четыре независимых блока.

Любая помощь приветствуется!

Ответ №1:

Предполагая, что вы определяете параметр с именем blocks, первый элемент в каждом блоке будет сопоставлен простым выполнением следующего:

 <xsl:apply-templates select="product/*[position() amp;<= $blocks]" />
  

Затем в шаблоне, который соответствует такому элементу, вам нужно выбрать сам элемент, а затем все последующие элементы для блока (которые будут зависеть от количества блоков) следующим образом

 <xsl:apply-templates
   select="self::*|following-sibling::*[position() mod $blocks = 0]"
   mode="block" />
  

Обратите внимание, что режим здесь заключается в том, чтобы остановить рекурсивный вызов шаблона. В соответствующий шаблон для этого вы можете добавить свой код для тегов span в вашем случае.

Итак, учитывая следующий XSLT

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>
   <xsl:param name="blocks" select="4" />

   <xsl:template match="/">
      <xsl:apply-templates select="product/*[position() amp;<= $blocks]" />
   </xsl:template>

   <xsl:template match="product/*">
      <div>
      <xsl:apply-templates 
         select="self::*|following-sibling::*[position() mod $blocks = 0]" 
         mode="block" />
      </div>
   </xsl:template>

   <xsl:template match="*" mode="block">
      <span><xsl:value-of select="." /></span>
   </xsl:template>
</xsl:stylesheet>
  

При применении к вашему образцу XML выводится следующее:

 <div><span>1</span><span>5</span></div>
<div><span>2</span><span>6</span></div>
<div><span>3</span><span>7</span></div>
<div><span>4</span><span>8</span></div>
  

Измените параметр на 3, и будет выведено следующее

 <div><span>1</span><span>4</span><span>7</span></div>
<div><span>2</span><span>5</span><span>8</span></div>
<div><span>3</span><span>6</span></div>