Отображение последовательности узлов в виде таблицы M x N для внутренней последовательности узлов

Я попытался представить последовательность узлов как таблицу M x N, и мне это удалось в соответствии с другим вопросом, уже заданным здесь.

Теперь я пытаюсь представить подпоследовательность как внутреннюю таблицу M x N.

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <item id="1">
        <subitem>1.1</subitem>
        <subitem>1.2</subitem>
        <subitem>1.3</subitem>
        <subitem>1.4</subitem>
    </item>
    <item id="2">
        <subitem>2.1</subitem>
        <subitem>2.2</subitem>
        <subitem>2.3</subitem>
        <subitem>2.4</subitem>
        <subitem>2.5</subitem>
    </item>
    <item id="3">
        <subitem>3.1</subitem>
        <subitem>3.2</subitem>
        <subitem>3.3</subitem>
        <subitem>3.4</subitem>
    </item>
    <item id="4">
        <subitem>4.1</subitem>
        <subitem>4.2</subitem>
        <subitem>4.3</subitem>
    </item>
</root>

и соответствующий XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet  version="1.0">
    <xsl:output method="xml" indent="yes"/>

    <xsl:key name="items-by-row" match="root/item"
             use="floor(count(preceding-sibling::item) div 2) + 1"/>

    <xsl:key name="subitems-by-row" match="root/item/subitem"
             use="floor(count(preceding-sibling::subitem) div 2) + 1"/>

    <xsl:template match="subitem" mode="cell">
            <subitem>
                <xsl:value-of select="current()" />
            </subitem>
    </xsl:template>

    <xsl:template match="subitem" mode="row">
        <subitem-row>
            <xsl:apply-templates select="key('subitems-by-row', position())" mode="cell"/>
            <xsl:variable name="span" select="2 - count(key('subitems-by-row', position()))"/>
        </subitem-row>
    </xsl:template>

    <xsl:template match="item" mode="cell">
        <td>
            <item>
                <xsl:value-of select="current()/@id" />
            </item>
            <xsl:apply-templates select="./subitem[position() mod 2 = 1]" mode="row"/>            
        </td>
    </xsl:template>

    <xsl:template match="item" mode="row">
        <tr>
            <xsl:apply-templates select="key('items-by-row', position())" mode="cell"/>
            <xsl:variable name="span" select="2 - count(key('items-by-row', position()))"/>
        </tr>
    </xsl:template>

    <xsl:template match="/">
        <html>
            <body>
                <table>
                    <xsl:apply-templates select="//item[position() mod 2 = 1]" mode="row"/>
                </table>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

приводит к следующим выводам:

<?xml version="1.0" encoding="UTF-8"?>
<html>
    <body>
        <table>
            <tr>
                <td>
                    <item>1</item>
                    <subitem-row>
                        <subitem>1.1</subitem>
                        <subitem>1.2</subitem>
                        <subitem>2.1</subitem>
                        <subitem>2.2</subitem>
                        <subitem>3.1</subitem>
                        <subitem>3.2</subitem>
                        <subitem>4.1</subitem>
                        <subitem>4.2</subitem>
                    </subitem-row>
                    <subitem-row>
                        <subitem>1.3</subitem>
                        <subitem>1.4</subitem>
                        <subitem>2.3</subitem>
                        <subitem>2.4</subitem>
                        <subitem>3.3</subitem>
                        <subitem>3.4</subitem>
                        <subitem>4.3</subitem>
                    </subitem-row>
                </td>
                <td>
                    <item>2</item>
                    <subitem-row>
                        <subitem>1.1</subitem>
                        <subitem>1.2</subitem>
                        <subitem>2.1</subitem>
                        <subitem>2.2</subitem>
                        <subitem>3.1</subitem>
                        <subitem>3.2</subitem>
                        <subitem>4.1</subitem>
                        <subitem>4.2</subitem>
                    </subitem-row>
                    <subitem-row>
                        <subitem>1.3</subitem>
                        <subitem>1.4</subitem>
                        <subitem>2.3</subitem>
                        <subitem>2.4</subitem>
                        <subitem>3.3</subitem>
                        <subitem>3.4</subitem>
                        <subitem>4.3</subitem>
                    </subitem-row>
                    <subitem-row>
                        <subitem>2.5</subitem>
                    </subitem-row>
                </td>
            </tr>
            <tr>
                <td>
                    <item>3</item>
                    <subitem-row>
                        <subitem>1.1</subitem>
                        <subitem>1.2</subitem>
                        <subitem>2.1</subitem>
                        <subitem>2.2</subitem>
                        <subitem>3.1</subitem>
                        <subitem>3.2</subitem>
                        <subitem>4.1</subitem>
                        <subitem>4.2</subitem>
                    </subitem-row>
                    <subitem-row>
                        <subitem>1.3</subitem>
                        <subitem>1.4</subitem>
                        <subitem>2.3</subitem>
                        <subitem>2.4</subitem>
                        <subitem>3.3</subitem>
                        <subitem>3.4</subitem>
                        <subitem>4.3</subitem>
                    </subitem-row>
                </td>
                <td>
                    <item>4</item>
                    <subitem-row>
                        <subitem>1.1</subitem>
                        <subitem>1.2</subitem>
                        <subitem>2.1</subitem>
                        <subitem>2.2</subitem>
                        <subitem>3.1</subitem>
                        <subitem>3.2</subitem>
                        <subitem>4.1</subitem>
                        <subitem>4.2</subitem>
                    </subitem-row>
                    <subitem-row>
                        <subitem>1.3</subitem>
                        <subitem>1.4</subitem>
                        <subitem>2.3</subitem>
                        <subitem>2.4</subitem>
                        <subitem>3.3</subitem>
                        <subitem>3.4</subitem>
                        <subitem>4.3</subitem>
                    </subitem-row>
                </td>
            </tr>
        </table>
    </body>
</html>

Как я могу сделать это, чтобы получить только подпункты соответствующего пункта?

brgds,
Берт

1 ответ

  1. Небольшое изменение subitemшаблона будет достаточно. Пытаться:

    <xsl:template match="subitem" mode="row">
        <xsl:variable name="item" select=".." />
        <subitem-row>
            <xsl:apply-templates 
                  select="key('subitems-by-row', position())[../@id = $item/@id]" mode="cell"/>
            <xsl:variable name="span" select="2 - count(key('subitems-by-row', position()))"/>
        </subitem-row>
    </xsl:template
    

    Со следующим (надеемся, ожидаемым) результатом:

    <html>
      <body>
        <table>
          <tr>
            <td>
              <item>1</item>
              <subitem-row>
                <subitem>1.1</subitem>
                <subitem>1.2</subitem>
              </subitem-row>
              <subitem-row>
                <subitem>1.3</subitem>
                <subitem>1.4</subitem>
              </subitem-row>
            </td>
            <td>
              <item>2</item>
              <subitem-row>
                <subitem>2.1</subitem>
                <subitem>2.2</subitem>
              </subitem-row>
              <subitem-row>
                <subitem>2.3</subitem>
                <subitem>2.4</subitem>
              </subitem-row>
              <subitem-row>
                <subitem>2.5</subitem>
              </subitem-row>
            </td>
          </tr>
          <tr>
            <td>
              <item>3</item>
              <subitem-row>
                <subitem>3.1</subitem>
                <subitem>3.2</subitem>
              </subitem-row>
              <subitem-row>
                <subitem>3.3</subitem>
                <subitem>3.4</subitem>
              </subitem-row>
            </td>
            <td>
              <item>4</item>
              <subitem-row>
                <subitem>4.1</subitem>
                <subitem>4.2</subitem>
              </subitem-row>
              <subitem-row>
                <subitem>4.3</subitem>
              </subitem-row>
            </td>
          </tr>
        </table>
      </body>
    </html>