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