Как я могу сгруппировать однородные данные в xsl? - PullRequest
0 голосов
/ 09 февраля 2012

Допустим, у нас есть следующие данные:

<all>
    <item id="1"/>
    <item id="2"/>
    ...
    <item id="N"/>
</all>

Какой самый элегантный, xslt-ish способ сгруппировать эти элементы? Например, представьте, что мы хотим таблицу с двумя ячейками в каждой строке. Вне моей головы я могу представить (хотя не проверено) в шаблоне, соответствующем элементу, я могу назвать этот элемент, выбрав следующий элемент. Но даже в этом случае я должен передать дополнительный параметр, чтобы сделать рекурсию конечной.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

используйте позицию и мод, например

<xsl:template match="/all">
    <table>
    <xsl:apply-templates name="item" mode="group"/>
    </table>
</xsl:template>

<xsl:template match="item[position() mod 2=1]" mode="group">
<tr>
<td><xsl:apply-templates select="." mode="render"/></td>
<td><xsl:apply-templates select="following-sibling::item[1]" mode="render"/></td>
</tr>
</xsl:template>

<xsl:template match="item[position() mod 2=0]"></xsl:template>

<xsl:template match="item" mode="render">item: <xsl:value-of select="@id"/></xsl:template>
0 голосов
/ 09 февраля 2012

Поскольку число строк может быть переменным .. Я передаю его как параметр в шаблон ..:)

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

  <xsl:template match="/all[node]">
    <table>
      <xsl:for-each select="node[1]">
        <xsl:call-template name="whoaa">
          <xsl:with-param name="count" select="'1'"/>
          <xsl:with-param name="row_count" select="'10'"/>
          <!--maximum row_count is set to 10 -->
        </xsl:call-template>
      </xsl:for-each>
    </table>
  </xsl:template>

  <xsl:template name="whoaa">
    <xsl:param name="count"/>
    <xsl:param name="row_count"/>
    <!--check if we have crossed row_count-->
    <xsl:if test="not ($row_count &lt; $count)">
      <tr>
        <td>
          <xsl:value-of select="."/>
        </td>
        <td>
          <!--copy next column-->
          <xsl:for-each select="following-sibling::node[1]">
            <xsl:value-of select="."/>
          </xsl:for-each>
        </td>
      </tr>
      <!--Select next row .. call the same template untill we reach (row_count > count)-->
      <xsl:for-each select="following-sibling::node[2]">
        <xsl:call-template name="whoaa">
          <xsl:with-param name="count" select="$count+2"/>
          <xsl:with-param name="row_count" select="$row_count"/>
        </xsl:call-template>
      </xsl:for-each>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...