Многоуровневая группировка узлов с помощью xslt: как скрыть родительский узел в выводе? - PullRequest
0 голосов
/ 11 мая 2019

У меня есть следующий XML:

<?xml version = "1.0" encoding="windows-1251"?>

<PLANTS>
    <PLANT>
        <NAME>APPLE</NAME>
        <SIZE>SMALL</SIZE>
        <TYPE>FRUIT</TYPE>
    </PLANT>
    <PLANT>
        <NAME>CUCUMBER</NAME>
        <SIZE>SMALL</SIZE>
        <TYPE>VEGETABLE</TYPE>
    </PLANT>
    <PLANT>
        <NAME>WATERMELON</NAME>
        <SIZE>BIG</SIZE>
        <TYPE>FRUIT</TYPE>
    </PLANT>
     <PLANT>
        <NAME>ORANGE</NAME>
        <SIZE>SMALL</SIZE>
        <TYPE>FRUIT</TYPE>
    </PLANT>
    <PLANT>
        <NAME>CARROT</NAME>
        <SIZE>SMALL</SIZE>
        <TYPE>VEGETABLE</TYPE>
    </PLANT>
</PLANTS>

Я хочу представить эти данные в виде таблицы HTML с группировкой по типу, а затем по размеру. Пока у меня есть этот XSLT-код (мне необходимо использовать xslt-1.0):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cfg="http://tempuri.org/config" exclude-result-prefixes="cfg">
   <xsl:output method="html" indent="yes"/>
   <xsl:key name="Type" match="PLANT" use="TYPE"/>
   <xsl:key name="TypeSize" match="PLANT" use="concat(TYPE, '|', SIZE)"/>

   <xsl:template match="PLANTS">
      <xsl:copy>
          <xsl:apply-templates mode="type" select="PLANT[generate-id() = generate-id(key('Type', TYPE)[1])]">
            <xsl:sort select="TYPE" />
         </xsl:apply-templates>
      </xsl:copy>
   </xsl:template>
   <xsl:template match="PLANT" mode="type">

      <xsl:variable name="type" select="TYPE"/>
      <table>
         <tbody>
            <tr>
               <td >TYPE :
                  <xsl:value-of select="$type"/></td>
            </tr>
            <xsl:apply-templates mode="typeSize" select="key('Type', $type)[generate-id()  = generate-id(key('TypeSize',concat(TYPE, '|', SIZE))[1])]"/>
         </tbody>
      </table>
   </xsl:template>


   <xsl:template match="PLANT" mode="typeSize">
      <xsl:variable name="typeSize" select="concat(TYPE, '|', SIZE)"/>
      <tr>
         <td >SIZE :
            <xsl:value-of select="SIZE"/></td>
      </tr>
      <xsl:for-each select="key('TypeSize',$typeSize)">
         <tr>
            <td>
               <xsl:value-of select="NAME"/>
            </td>

         </tr>
      </xsl:for-each>
   </xsl:template>

   <xsl:template match="PLANT">
      <xsl:copy-of select="."/>
   </xsl:template>
</xsl:stylesheet>

Итак, вывод:

<PLANTS>
   <table>
      <tbody>
         <tr>
            <td>TYPE :
               FRUIT
            </td>
         </tr>
         <tr>
            <td>SIZE :
               SMALL
            </td>
         </tr>
         <tr>
            <td>APPLE</td>
         </tr>
         <tr>
            <td>ORANGE</td>
         </tr>
         <tr>
            <td>SIZE :
               BIG
            </td>
         </tr>
         <tr>
            <td>WATERMELON</td>
         </tr>
      </tbody>
   </table>
   <table>
      <tbody>
         <tr>
            <td>TYPE :
               VEGETABLE
            </td>
         </tr>
         <tr>
            <td>SIZE :
               SMALL
            </td>
         </tr>
         <tr>
            <td>CUCUMBER</td>
         </tr>
         <tr>
            <td>CARROT</td>
         </tr>
      </tbody>
   </table>
</PLANTS>

Вывод почти идеальный, но я хочу избавиться от этого тега <PLANTS>. Как я могу это сделать?

Вы можете найти весь код здесь

1 Ответ

1 голос
/ 11 мая 2019

Вы создаете его в

<xsl:template match="PLANTS">
  <xsl:copy>

, поэтому просто удалите это xsl:copy и просто примените свои шаблоны (или настройте некоторую структуру документа HTML, если вы говорите, что хотите вывод HTML).

...