Мюнхенская группировка XSLT в HTML - PullRequest
0 голосов
/ 17 сентября 2018

Вот мой XML:

<Tree All="False">
  <Menu Type="Leaf">
    <Label>Menu 1</Label>
  </Menu>
  <Menu>
    <Label>Menu 2</Label>
  </Menu>
  <Menu>
    <Label>Menu 3</Label>
  </Menu>
  <Break />
  <Menu>
    <Label>Menu 4</Label>
  </Menu>
  <Menu>
    <Label>Menu 5</Label>
  </Menu>
  <Menu>
    <Label>Menu 6</Label>
  </Menu>
  <Menu>
    <Label>Menu 7</Label>
  </Menu>
  <Break />
  <Menu>
    <Label>Menu 8</Label>
  </Menu>
</Tree>

Я пытаюсь преобразовать узлы в таблицу HTML с узлом <Break /> в качестве разделителя. Ожидаемый вывод HTML:

enter image description here

Я могу группировать узлы по мюнхенскому методу, используя XSLT 1.0. Но теперь я застрял в преобразовании их в таблицу HTML. Вот мой текущий XSLT:

<xsl:key name="groups" match="Tree*[not(self::Break)]" use="count(preceding-sibling::Break)" />

<xsl:template match="Tree">
  <xsl:variable name="groupings" select="*[not(self::Break)][generate-id() = generate-id(key('groups', count(preceding-sibling::Break))[1])]" />
  <xsl:for-each select="$groupings">
    <xsl:sort select="count(key('groups', count(preceding-sibling::Break)))" order="descending" />
    <xsl:if test="position() = 1">
      <xsl:variable name="rows" select="count(key('groups', count(preceding-sibling::Break)))" />
      <xsl:call-template name="GroupTemplate">
        <xsl:with-param name="rows" select="$rows" />
        <xsl:with-param name="groupings" select="$groupings" />
      </xsl:call-template>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

<xsl:template name="GroupTemplate">
  <xsl:param name="rows" />
  <xsl:param name="groupings" />
  <table>
    <xsl:for-each select="$groupings">
      <xsl:variable name="group" select="key('groups', count(preceding-sibling::Break))" />
      <xsl:for-each select="$group[position() &lt;= $rows]">
        <xsl:value-of select="." />
      </xsl:for-each>
      <br></br>
    </xsl:for-each>
  </table>
</xsl:template>

Мой текущий код дает мне этот результат, который неверен:

Меню 1 Меню 2 Меню 3

Меню 4 Меню 5 Меню 6 Меню 7

Меню 8

1 Ответ

0 голосов
/ 17 сентября 2018

Вы начали правильно, указав группу с максимальным количеством строк.Что вам действительно нужно сделать, это «от 1 до $ maxorw» в вашем шаблоне, что вы можете сделать в XSLT 2.0, но не 1.0 легко.Что вы можете сделать, это то, что вместо того, чтобы передавать значение максимальных строк, вместо этого передайте группу с максимальными строками и выберите из этого для начала.Затем «позиция» дает вам «от 1 до 4», которые вам нужны.

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" version="5.0" />
<xsl:key name="groups" match="Tree/*[not(self::Break)]" use="count(preceding-sibling::Break)" />

<xsl:template match="Tree">
  <xsl:variable name="groupings" select="*[not(self::Break)][generate-id() = generate-id(key('groups', count(preceding-sibling::Break))[1])]" />
  <xsl:for-each select="$groupings">
    <xsl:sort select="count(key('groups', count(preceding-sibling::Break)))" order="descending" />
    <xsl:if test="position() = 1">
      <xsl:variable name="maxRows" select="key('groups', count(preceding-sibling::Break))" />
      <xsl:call-template name="GroupTemplate">
        <xsl:with-param name="maxRows" select="$maxRows" />
        <xsl:with-param name="groupings" select="$groupings" />
      </xsl:call-template>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

<xsl:template name="GroupTemplate">
  <xsl:param name="maxRows" />
  <xsl:param name="groupings" />
  <table>
    <xsl:for-each select="$maxRows">
      <xsl:variable name="position" select="position()" />
      <tr>
        <xsl:for-each select="$groupings">
          <xsl:variable name="group" select="key('groups', count(preceding-sibling::Break))" />
          <td>
            <xsl:value-of select="normalize-space($group[position() = $position])" />
          </td>
        </xsl:for-each>
      </tr>
    </xsl:for-each>
  </table>
</xsl:template>
</xsl:stylesheet>
...