Xml 按键和位置对XSLT进行分组和排序()

Xml 按键和位置对XSLT进行分组和排序(),xml,xslt,key,grouping,xslt-2.0,Xml,Xslt,Key,Grouping,Xslt 2.0,我试图显示按字母顺序排序的数据,以便以相同字母开头的项目在单独的列中。在启动新列之前,这些列最多可以容纳10项。我可以成功地按字母顺序划分数据,并按每列的项数进行划分,但我很难将这2项结合起来: 按字母顺序划分: <xsl:template match="/"> <xsl:key name="node-by-first-letter" match="node" use="substring(@email, 1, 1)" /> <div class="scroll

我试图显示按字母顺序排序的数据,以便以相同字母开头的项目在单独的列中。在启动新列之前,这些列最多可以容纳10项。我可以成功地按字母顺序划分数据,并按每列的项数进行划分,但我很难将这2项结合起来:

按字母顺序划分:

<xsl:template match="/">
<xsl:key name="node-by-first-letter" match="node" use="substring(@email, 1, 1)" />


<div class="scroller-panel">
    <xsl:for-each select="msxml:node-set($members)/node[count(. | key('node-by-first-letter', substring(@email, 1, 1))[1]) = 1]">
        <xsl:sort select="@email" order="ascending"/>

            <xsl:apply-templates select="." mode="group" />
</xsl:for-each></div></xsl:template>
<xsl:template match="node" mode="group">
    <div class="column-312 scroller-item people-search-column fade-panel">
    <h2>
        <xsl:value-of select="Exslt.ExsltStrings:uppercase(substring(@email,1,1))"/>
    </h2>
    <ul class="stripe-list">
        <xsl:apply-templates select="key('node-by-first-letter', substring(@email, 1, 1))" mode="item">
            <xsl:sort select="@email" />
        </xsl:apply-templates>    
    </ul>
    </div>
</xsl:template>
<xsl:template match="node" mode="item">
            <li>
                <a href="4.0.1.person.profile.html">
                    <xsl:value-of select="@email"/>
                </a>
            </li>
</xsl:template>

  • 除以每列的最大项目数:

    <xsl:for-each select="msxml:node-set($members)/members/member[position() mod 10 = 1]">
    <ul>
    <xsl:for-each select=". | following-sibling::*[not(position()    >=   10)]">
    <li>
    <xsl:value-of select="@email"/>
    </li>
    </xsl:for-each>
    </ul>
    </xsl:for-each>
    
    
    
    首选输出如下所示:


    I.XSLT 2.0解决方案

    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
         exclude-result-prefixes="xs">
        <xsl:output omit-xml-declaration="yes" indent="yes"/>
        <xsl:param name="pColLength" as="xs:integer" select="10"/>
    
     <xsl:template match="/*">
         <names>
           <xsl:for-each-group select="name"
                               group-by="substring(.,1,1)">
            <xsl:sort select="current-grouping-key()"/>
             <xsl:for-each-group select="current-group()"
              group-by="(position()-1) idiv $pColLength">
              <column>
                <xsl:copy-of select="current-group()"/>
              </column>
             </xsl:for-each-group>
           </xsl:for-each-group>
         </names>
     </xsl:template>
    </xsl:stylesheet>
    
    <names>
       <column>
          <name>A A</name>
          <name>A B</name>
          <name>A C</name>
          <name>A D</name>
          <name>A E</name>
          <name>A F</name>
          <name>A G</name>
          <name>A H</name>
          <name>A I</name>
          <name>A J</name>
       </column>
       <column>
          <name>A K</name>
          <name>A L</name>
       </column>
       <column>
          <name>R A</name>
          <name>R B</name>
          <name>R C</name>
          <name>R D</name>
          <name>R E</name>
          <name>R F</name>
          <name>R G</name>
          <name>R H</name>
          <name>R I</name>
          <name>R J</name>
       </column>
       <column>
          <name>R K</name>
          <name>R L</name>
       </column>
       <column>
          <name>T A</name>
          <name>T B</name>
          <name>T C</name>
          <name>T D</name>
          <name>T E</name>
          <name>T F</name>
          <name>T G</name>
          <name>T H</name>
          <name>T I</name>
          <name>T J</name>
       </column>
       <column>
          <name>T K</name>
          <name>T L</name>
       </column>
       <column>
          <name>X A</name>
          <name>X B</name>
          <name>X C</name>
          <name>X D</name>
          <name>X E</name>
          <name>X F</name>
          <name>X G</name>
          <name>X H</name>
          <name>X I</name>
          <name>X J</name>
       </column>
       <column>
          <name>X K</name>
          <name>X L</name>
       </column>
    </names>
    
    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:param name="pColLength" select="10"/>
    
     <xsl:key name="kStarting" match="name"
      use="substring(.,1,1)"/>
    
     <xsl:template match="/*">
      <names>
              <xsl:for-each select=
               "name
                  [generate-id()
                  =
                   generate-id(key('kStarting', substring(.,1,1))[1])
                  ]
               ">
                <xsl:sort select="substring(.,1,1)"/>
    
                <xsl:variable name="vgroupNames" select=
                   "key('kStarting', substring(.,1,1))"/>
    
                <xsl:apply-templates select="$vgroupNames[1]">
                  <xsl:with-param name="pGroup" select="$vgroupNames"/>
                  <xsl:with-param name="pGroupLength" select=
                   "count($vgroupNames)"/>
                </xsl:apply-templates>
              </xsl:for-each>
      </names>
     </xsl:template>
    
     <xsl:template match="name">
       <xsl:param name="pGroup"/>
       <xsl:param name="pGroupLength"/>
       <xsl:param name="pInd" select="1"/>
    
       <xsl:if test="not($pInd > $pGroupLength)">
          <column>
           <xsl:copy-of select=
           "$pGroup
               [position() >= $pInd
              and
                not(position() > $pInd + $pColLength -1)
                ]"/>
          </column>
    
          <xsl:apply-templates select=
            "$pGroup[position() = $pInd + $pColLength]">
           <xsl:with-param name="pGroup" select="$pGroup"/>
            <xsl:with-param name="pGroupLength" select="$pGroupLength"/>
            <xsl:with-param name="pInd" select="$pInd + $pColLength"/>
           </xsl:apply-templates>
       </xsl:if>
     </xsl:template>
    </xsl:stylesheet>
    
    <names>
       <column>
          <name>A A</name>
          <name>A B</name>
          <name>A C</name>
          <name>A D</name>
          <name>A E</name>
          <name>A F</name>
          <name>A G</name>
          <name>A H</name>
          <name>A I</name>
          <name>A J</name>
       </column>
       <column>
          <name>A K</name>
          <name>A L</name>
       </column>
       <column>
          <name>R A</name>
          <name>R B</name>
          <name>R C</name>
          <name>R D</name>
          <name>R E</name>
          <name>R F</name>
          <name>R G</name>
          <name>R H</name>
          <name>R I</name>
          <name>R J</name>
       </column>
       <column>
          <name>R K</name>
          <name>R L</name>
       </column>
       <column>
          <name>T A</name>
          <name>T B</name>
          <name>T C</name>
          <name>T D</name>
          <name>T E</name>
          <name>T F</name>
          <name>T G</name>
          <name>T H</name>
          <name>T I</name>
          <name>T J</name>
       </column>
       <column>
          <name>T K</name>
          <name>T L</name>
       </column>
       <column>
          <name>X A</name>
          <name>X B</name>
          <name>X C</name>
          <name>X D</name>
          <name>X E</name>
          <name>X F</name>
          <name>X G</name>
          <name>X H</name>
          <name>X I</name>
          <name>X J</name>
       </column>
       <column>
          <name>X K</name>
          <name>X L</name>
       </column>
    </names>
    
    当应用于同一XML文档时(如上所述),会产生相同的期望输出——名称按第一个字母开头排序,并放入10个项目的列中

    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
         exclude-result-prefixes="xs">
        <xsl:output omit-xml-declaration="yes" indent="yes"/>
        <xsl:param name="pColLength" as="xs:integer" select="10"/>
    
     <xsl:template match="/*">
         <names>
           <xsl:for-each-group select="name"
                               group-by="substring(.,1,1)">
            <xsl:sort select="current-grouping-key()"/>
             <xsl:for-each-group select="current-group()"
              group-by="(position()-1) idiv $pColLength">
              <column>
                <xsl:copy-of select="current-group()"/>
              </column>
             </xsl:for-each-group>
           </xsl:for-each-group>
         </names>
     </xsl:template>
    </xsl:stylesheet>
    
    <names>
       <column>
          <name>A A</name>
          <name>A B</name>
          <name>A C</name>
          <name>A D</name>
          <name>A E</name>
          <name>A F</name>
          <name>A G</name>
          <name>A H</name>
          <name>A I</name>
          <name>A J</name>
       </column>
       <column>
          <name>A K</name>
          <name>A L</name>
       </column>
       <column>
          <name>R A</name>
          <name>R B</name>
          <name>R C</name>
          <name>R D</name>
          <name>R E</name>
          <name>R F</name>
          <name>R G</name>
          <name>R H</name>
          <name>R I</name>
          <name>R J</name>
       </column>
       <column>
          <name>R K</name>
          <name>R L</name>
       </column>
       <column>
          <name>T A</name>
          <name>T B</name>
          <name>T C</name>
          <name>T D</name>
          <name>T E</name>
          <name>T F</name>
          <name>T G</name>
          <name>T H</name>
          <name>T I</name>
          <name>T J</name>
       </column>
       <column>
          <name>T K</name>
          <name>T L</name>
       </column>
       <column>
          <name>X A</name>
          <name>X B</name>
          <name>X C</name>
          <name>X D</name>
          <name>X E</name>
          <name>X F</name>
          <name>X G</name>
          <name>X H</name>
          <name>X I</name>
          <name>X J</name>
       </column>
       <column>
          <name>X K</name>
          <name>X L</name>
       </column>
    </names>
    
    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:param name="pColLength" select="10"/>
    
     <xsl:key name="kStarting" match="name"
      use="substring(.,1,1)"/>
    
     <xsl:template match="/*">
      <names>
              <xsl:for-each select=
               "name
                  [generate-id()
                  =
                   generate-id(key('kStarting', substring(.,1,1))[1])
                  ]
               ">
                <xsl:sort select="substring(.,1,1)"/>
    
                <xsl:variable name="vgroupNames" select=
                   "key('kStarting', substring(.,1,1))"/>
    
                <xsl:apply-templates select="$vgroupNames[1]">
                  <xsl:with-param name="pGroup" select="$vgroupNames"/>
                  <xsl:with-param name="pGroupLength" select=
                   "count($vgroupNames)"/>
                </xsl:apply-templates>
              </xsl:for-each>
      </names>
     </xsl:template>
    
     <xsl:template match="name">
       <xsl:param name="pGroup"/>
       <xsl:param name="pGroupLength"/>
       <xsl:param name="pInd" select="1"/>
    
       <xsl:if test="not($pInd > $pGroupLength)">
          <column>
           <xsl:copy-of select=
           "$pGroup
               [position() >= $pInd
              and
                not(position() > $pInd + $pColLength -1)
                ]"/>
          </column>
    
          <xsl:apply-templates select=
            "$pGroup[position() = $pInd + $pColLength]">
           <xsl:with-param name="pGroup" select="$pGroup"/>
            <xsl:with-param name="pGroupLength" select="$pGroupLength"/>
            <xsl:with-param name="pInd" select="$pInd + $pColLength"/>
           </xsl:apply-templates>
       </xsl:if>
     </xsl:template>
    </xsl:stylesheet>
    
    <names>
       <column>
          <name>A A</name>
          <name>A B</name>
          <name>A C</name>
          <name>A D</name>
          <name>A E</name>
          <name>A F</name>
          <name>A G</name>
          <name>A H</name>
          <name>A I</name>
          <name>A J</name>
       </column>
       <column>
          <name>A K</name>
          <name>A L</name>
       </column>
       <column>
          <name>R A</name>
          <name>R B</name>
          <name>R C</name>
          <name>R D</name>
          <name>R E</name>
          <name>R F</name>
          <name>R G</name>
          <name>R H</name>
          <name>R I</name>
          <name>R J</name>
       </column>
       <column>
          <name>R K</name>
          <name>R L</name>
       </column>
       <column>
          <name>T A</name>
          <name>T B</name>
          <name>T C</name>
          <name>T D</name>
          <name>T E</name>
          <name>T F</name>
          <name>T G</name>
          <name>T H</name>
          <name>T I</name>
          <name>T J</name>
       </column>
       <column>
          <name>T K</name>
          <name>T L</name>
       </column>
       <column>
          <name>X A</name>
          <name>X B</name>
          <name>X C</name>
          <name>X D</name>
          <name>X E</name>
          <name>X F</name>
          <name>X G</name>
          <name>X H</name>
          <name>X I</name>
          <name>X J</name>
       </column>
       <column>
          <name>X K</name>
          <name>X L</name>
       </column>
    </names>
    

    I.XSLT 2.0解决方案

    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
         exclude-result-prefixes="xs">
        <xsl:output omit-xml-declaration="yes" indent="yes"/>
        <xsl:param name="pColLength" as="xs:integer" select="10"/>
    
     <xsl:template match="/*">
         <names>
           <xsl:for-each-group select="name"
                               group-by="substring(.,1,1)">
            <xsl:sort select="current-grouping-key()"/>
             <xsl:for-each-group select="current-group()"
              group-by="(position()-1) idiv $pColLength">
              <column>
                <xsl:copy-of select="current-group()"/>
              </column>
             </xsl:for-each-group>
           </xsl:for-each-group>
         </names>
     </xsl:template>
    </xsl:stylesheet>
    
    <names>
       <column>
          <name>A A</name>
          <name>A B</name>
          <name>A C</name>
          <name>A D</name>
          <name>A E</name>
          <name>A F</name>
          <name>A G</name>
          <name>A H</name>
          <name>A I</name>
          <name>A J</name>
       </column>
       <column>
          <name>A K</name>
          <name>A L</name>
       </column>
       <column>
          <name>R A</name>
          <name>R B</name>
          <name>R C</name>
          <name>R D</name>
          <name>R E</name>
          <name>R F</name>
          <name>R G</name>
          <name>R H</name>
          <name>R I</name>
          <name>R J</name>
       </column>
       <column>
          <name>R K</name>
          <name>R L</name>
       </column>
       <column>
          <name>T A</name>
          <name>T B</name>
          <name>T C</name>
          <name>T D</name>
          <name>T E</name>
          <name>T F</name>
          <name>T G</name>
          <name>T H</name>
          <name>T I</name>
          <name>T J</name>
       </column>
       <column>
          <name>T K</name>
          <name>T L</name>
       </column>
       <column>
          <name>X A</name>
          <name>X B</name>
          <name>X C</name>
          <name>X D</name>
          <name>X E</name>
          <name>X F</name>
          <name>X G</name>
          <name>X H</name>
          <name>X I</name>
          <name>X J</name>
       </column>
       <column>
          <name>X K</name>
          <name>X L</name>
       </column>
    </names>
    
    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:param name="pColLength" select="10"/>
    
     <xsl:key name="kStarting" match="name"
      use="substring(.,1,1)"/>
    
     <xsl:template match="/*">
      <names>
              <xsl:for-each select=
               "name
                  [generate-id()
                  =
                   generate-id(key('kStarting', substring(.,1,1))[1])
                  ]
               ">
                <xsl:sort select="substring(.,1,1)"/>
    
                <xsl:variable name="vgroupNames" select=
                   "key('kStarting', substring(.,1,1))"/>
    
                <xsl:apply-templates select="$vgroupNames[1]">
                  <xsl:with-param name="pGroup" select="$vgroupNames"/>
                  <xsl:with-param name="pGroupLength" select=
                   "count($vgroupNames)"/>
                </xsl:apply-templates>
              </xsl:for-each>
      </names>
     </xsl:template>
    
     <xsl:template match="name">
       <xsl:param name="pGroup"/>
       <xsl:param name="pGroupLength"/>
       <xsl:param name="pInd" select="1"/>
    
       <xsl:if test="not($pInd > $pGroupLength)">
          <column>
           <xsl:copy-of select=
           "$pGroup
               [position() >= $pInd
              and
                not(position() > $pInd + $pColLength -1)
                ]"/>
          </column>
    
          <xsl:apply-templates select=
            "$pGroup[position() = $pInd + $pColLength]">
           <xsl:with-param name="pGroup" select="$pGroup"/>
            <xsl:with-param name="pGroupLength" select="$pGroupLength"/>
            <xsl:with-param name="pInd" select="$pInd + $pColLength"/>
           </xsl:apply-templates>
       </xsl:if>
     </xsl:template>
    </xsl:stylesheet>
    
    <names>
       <column>
          <name>A A</name>
          <name>A B</name>
          <name>A C</name>
          <name>A D</name>
          <name>A E</name>
          <name>A F</name>
          <name>A G</name>
          <name>A H</name>
          <name>A I</name>
          <name>A J</name>
       </column>
       <column>
          <name>A K</name>
          <name>A L</name>
       </column>
       <column>
          <name>R A</name>
          <name>R B</name>
          <name>R C</name>
          <name>R D</name>
          <name>R E</name>
          <name>R F</name>
          <name>R G</name>
          <name>R H</name>
          <name>R I</name>
          <name>R J</name>
       </column>
       <column>
          <name>R K</name>
          <name>R L</name>
       </column>
       <column>
          <name>T A</name>
          <name>T B</name>
          <name>T C</name>
          <name>T D</name>
          <name>T E</name>
          <name>T F</name>
          <name>T G</name>
          <name>T H</name>
          <name>T I</name>
          <name>T J</name>
       </column>
       <column>
          <name>T K</name>
          <name>T L</name>
       </column>
       <column>
          <name>X A</name>
          <name>X B</name>
          <name>X C</name>
          <name>X D</name>
          <name>X E</name>
          <name>X F</name>
          <name>X G</name>
          <name>X H</name>
          <name>X I</name>
          <name>X J</name>
       </column>
       <column>
          <name>X K</name>
          <name>X L</name>
       </column>
    </names>
    
    当应用于同一XML文档时(如上所述),会产生相同的期望输出——名称按第一个字母开头排序,并放入10个项目的列中

    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
         exclude-result-prefixes="xs">
        <xsl:output omit-xml-declaration="yes" indent="yes"/>
        <xsl:param name="pColLength" as="xs:integer" select="10"/>
    
     <xsl:template match="/*">
         <names>
           <xsl:for-each-group select="name"
                               group-by="substring(.,1,1)">
            <xsl:sort select="current-grouping-key()"/>
             <xsl:for-each-group select="current-group()"
              group-by="(position()-1) idiv $pColLength">
              <column>
                <xsl:copy-of select="current-group()"/>
              </column>
             </xsl:for-each-group>
           </xsl:for-each-group>
         </names>
     </xsl:template>
    </xsl:stylesheet>
    
    <names>
       <column>
          <name>A A</name>
          <name>A B</name>
          <name>A C</name>
          <name>A D</name>
          <name>A E</name>
          <name>A F</name>
          <name>A G</name>
          <name>A H</name>
          <name>A I</name>
          <name>A J</name>
       </column>
       <column>
          <name>A K</name>
          <name>A L</name>
       </column>
       <column>
          <name>R A</name>
          <name>R B</name>
          <name>R C</name>
          <name>R D</name>
          <name>R E</name>
          <name>R F</name>
          <name>R G</name>
          <name>R H</name>
          <name>R I</name>
          <name>R J</name>
       </column>
       <column>
          <name>R K</name>
          <name>R L</name>
       </column>
       <column>
          <name>T A</name>
          <name>T B</name>
          <name>T C</name>
          <name>T D</name>
          <name>T E</name>
          <name>T F</name>
          <name>T G</name>
          <name>T H</name>
          <name>T I</name>
          <name>T J</name>
       </column>
       <column>
          <name>T K</name>
          <name>T L</name>
       </column>
       <column>
          <name>X A</name>
          <name>X B</name>
          <name>X C</name>
          <name>X D</name>
          <name>X E</name>
          <name>X F</name>
          <name>X G</name>
          <name>X H</name>
          <name>X I</name>
          <name>X J</name>
       </column>
       <column>
          <name>X K</name>
          <name>X L</name>
       </column>
    </names>
    
    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:param name="pColLength" select="10"/>
    
     <xsl:key name="kStarting" match="name"
      use="substring(.,1,1)"/>
    
     <xsl:template match="/*">
      <names>
              <xsl:for-each select=
               "name
                  [generate-id()
                  =
                   generate-id(key('kStarting', substring(.,1,1))[1])
                  ]
               ">
                <xsl:sort select="substring(.,1,1)"/>
    
                <xsl:variable name="vgroupNames" select=
                   "key('kStarting', substring(.,1,1))"/>
    
                <xsl:apply-templates select="$vgroupNames[1]">
                  <xsl:with-param name="pGroup" select="$vgroupNames"/>
                  <xsl:with-param name="pGroupLength" select=
                   "count($vgroupNames)"/>
                </xsl:apply-templates>
              </xsl:for-each>
      </names>
     </xsl:template>
    
     <xsl:template match="name">
       <xsl:param name="pGroup"/>
       <xsl:param name="pGroupLength"/>
       <xsl:param name="pInd" select="1"/>
    
       <xsl:if test="not($pInd > $pGroupLength)">
          <column>
           <xsl:copy-of select=
           "$pGroup
               [position() >= $pInd
              and
                not(position() > $pInd + $pColLength -1)
                ]"/>
          </column>
    
          <xsl:apply-templates select=
            "$pGroup[position() = $pInd + $pColLength]">
           <xsl:with-param name="pGroup" select="$pGroup"/>
            <xsl:with-param name="pGroupLength" select="$pGroupLength"/>
            <xsl:with-param name="pInd" select="$pInd + $pColLength"/>
           </xsl:apply-templates>
       </xsl:if>
     </xsl:template>
    </xsl:stylesheet>
    
    <names>
       <column>
          <name>A A</name>
          <name>A B</name>
          <name>A C</name>
          <name>A D</name>
          <name>A E</name>
          <name>A F</name>
          <name>A G</name>
          <name>A H</name>
          <name>A I</name>
          <name>A J</name>
       </column>
       <column>
          <name>A K</name>
          <name>A L</name>
       </column>
       <column>
          <name>R A</name>
          <name>R B</name>
          <name>R C</name>
          <name>R D</name>
          <name>R E</name>
          <name>R F</name>
          <name>R G</name>
          <name>R H</name>
          <name>R I</name>
          <name>R J</name>
       </column>
       <column>
          <name>R K</name>
          <name>R L</name>
       </column>
       <column>
          <name>T A</name>
          <name>T B</name>
          <name>T C</name>
          <name>T D</name>
          <name>T E</name>
          <name>T F</name>
          <name>T G</name>
          <name>T H</name>
          <name>T I</name>
          <name>T J</name>
       </column>
       <column>
          <name>T K</name>
          <name>T L</name>
       </column>
       <column>
          <name>X A</name>
          <name>X B</name>
          <name>X C</name>
          <name>X D</name>
          <name>X E</name>
          <name>X F</name>
          <name>X G</name>
          <name>X H</name>
          <name>X I</name>
          <name>X J</name>
       </column>
       <column>
          <name>X K</name>
          <name>X L</name>
       </column>
    </names>
    

    提供示例输入和所需输出。为什么不使用多程变换混合这两种解决方案?很好的问题,+1。请参阅我的答案,以获得演示几种技术的完整解决方案:1)基于值的起始字符的Muenchian分组;2) 非同级项的位置分组(可能来自不同的文档,而不是元素)。我还添加了详细的解释。@empo:在XSLT 1.0中,多过程转换通常需要使用
    xxx:node-set()
    扩展函数将上一步的结果从RTF转换为常规树。我的解决方案不需要任何扩展函数。提供示例输入和所需输出。为什么不使用多通道转换混合这两种解决方案?很好的问题,+1。请参阅我的答案,以获得演示几种技术的完整解决方案:1)基于值的起始字符的Muenchian分组;2) 非同级项的位置分组(可能来自不同的文档,而不是元素)。我还添加了详细的解释。@empo:在XSLT 1.0中,多过程转换通常需要使用
    xxx:node-set()
    扩展函数将上一步的结果从RTF转换为常规树。我的解决方案不需要任何扩展函数。+1表示正确答案。我建议使用
    node-set()
    ,因为从OP信息开始,我无法给出完整的解决方案(缺少输入),也没有像您正确地那样考虑自己创建一个。这确实是正确的方法。@empo:从这个答案中我们可以学到的是,为了将节点分组到列中,节点不必是兄弟节点。+1表示好的答案。我建议使用
    node-set()
    ,因为从OP信息开始,我无法给出完整的解决方案(缺少输入),也没有像您正确地那样考虑自己创建一个。这确实是正确的方法。@empo:从这个答案中我们可以学到的是,节点不必为了将它们分组到列中而成为同级节点。