множественное вложение xsl 2.0 на основе разных элементов - PullRequest
0 голосов
/ 01 декабря 2018

Как мне несколько раз вложить следующий xml, используя xsl 2.0 на основе level1 (внешний), level2 (средний), level3 (внутренний)?

<rootNode>
   <fruits>
      <fruit>
         <level1>4</level1>
         <level2/>
         <level3/>
         <kind>orange</kind>
         <size>big</size>
         <origin>california</origin>
      </fruit>
      <fruit>
         <level1>4</level1>
         <level2>2</level2>
         <level3/>
         <kind>lemon</kind>
         <size>small</size>
         <origin>florida</origin>
      </fruit>
      <fruit>
         <level1>4</level1>
         <level2>2</level2>
         <level3>1</level3>
         <kind>pineapple</kind>
         <size>normal</size>
         <origin>oregon</origin>
      </fruit>
      <fruit>
         <level1>5</level1>
         <level2>2</level2>
         <level3/>
         <kind>pineapple</kind>
         <size>normal</size>
         <origin>oregon</origin>
      </fruit>
      <fruit>
         <level1>5</level1>
         <level2>1</level2>
         <level3/>
         <kind>peer</kind>
         <size>big</size>
         <origin>ohio</origin>
      </fruit>
   </fruits>
</rootNode>

Я могу сделать это для level1, используя следующий xslt

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/rootNode/fruits">
        <xsl:for-each-group select="fruit" group-by="level1">
            <level1 name="{current-grouping-key()}">
                <xsl:copy-of select="current-group()"/>
            </level1>
        </xsl:for-each-group>
    </xsl:template>
<xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

Однако использование выходных данных и повторное выполнение для lavel2 не работает.Функция рекурсии?Как это написать?

1 Ответ

0 голосов
/ 01 декабря 2018

Как следует из названия, вам нужно вкладывать две xsl:for-each-group инструкции, одна внутри другой:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/rootNode">
    <xsl:for-each-group select="fruits/fruit" group-by="level1">
        <level1 name="{current-grouping-key()}">
            <xsl:for-each-group select="current-group()" group-by="level2">
                <level2 name="{current-grouping-key()}">
                    <xsl:copy-of select="current-group()"/>
                </level2>   
            </level1>
    </xsl:for-each-group>
</xsl:template>

</xsl:stylesheet>

Демонстрация: https://xsltfiddle.liberty -development.net / bdxtre

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...