在 XSLT 中对每个父节点下的子节点进行分组

Posted

技术标签:

【中文标题】在 XSLT 中对每个父节点下的子节点进行分组【英文标题】:Grouping Child nodes under each Parent nodes in XSLT 【发布时间】:2018-04-20 04:16:54 【问题描述】:

我是 XSLT 分组概念的新手。我正在尝试使用 XSLT 2.0 对以下 XML 进行分组。

<Root>
    <Entry>
        <Split>
            <Data>
                <Num>20</Num>
                <Type>A</Type>
            </Data>
            <Data>
                <Num>20</Num>
                <Type>A</Type>
            </Data>
            <Data>
                <Num>20</Num>
                <Type>A</Type>
            </Data>
        </Split>
        <Split>
            <Data>
                <Num>20</Num>
                <Type>B</Type>
            </Data>
            <Data>
                <Num>20</Num>
                <Type>B</Type>
            </Data>
        </Split>
        <Split>
            <Data>
                <Num>21</Num>
                <Type>C</Type>
            </Data>
            <Data>
                <Num>21</Num>
                <Type>C</Type>
            </Data>
        </Split>        
    </Entry>
</Root>

以下是我的预期输出。

<Root>
    <Entry>
        <Split>
            <New_Tag>
                <Data>
                    <Num>20</Num>
                    <Type>A</Type>
                </Data>
                <Data>
                    <Num>20</Num>
                    <Type>A</Type>
                </Data>
                <Data>
                    <Num>20</Num>
                    <Type>A</Type>
                </Data>
            </New_Tag>
            <New_Tag>
                <Data>
                    <Num>20</Num>
                    <Type>B</Type>
                </Data>
                <Data>
                    <Num>20</Num>
                    <Type>B</Type>
                </Data>
            </New_Tag>
        </Split>
        <Split>
            <New_Tag>
                <Data>
                    <Num>21</Num>
                    <Type>A</Type>
                </Data>
                <Data>
                    <Num>21</Num>
                    <Type>A</Type>
                </Data>
            </New_Tag>
        </Split>
    </Entry>
</Root>

如果在 XSLT 2.0 中具有相同的 'Num' 值,我想将 'Split' 下的 'Data' 标记分组到 'New_Tag' 。将有更多的报告条目。 请帮我解决这个问题。

有没有办法解决这个问题?

提前致谢。

【问题讨论】:

【参考方案1】:

您可以将Split 元素按Data/Num 分组并重命名Split's 到New_Tag

示例...

XML 输入

<Root>
    <Entry>
        <Split>
            <Data>
                <Num>20</Num>
                <Type>A</Type>
            </Data>
            <Data>
                <Num>20</Num>
                <Type>A</Type>
            </Data>
            <Data>
                <Num>20</Num>
                <Type>A</Type>
            </Data>
        </Split>
        <Split>
            <Data>
                <Num>20</Num>
                <Type>B</Type>
            </Data>
            <Data>
                <Num>20</Num>
                <Type>B</Type>
            </Data>
        </Split>
        <Split>
            <Data>
                <Num>21</Num>
                <Type>C</Type>
            </Data>
            <Data>
                <Num>21</Num>
                <Type>C</Type>
            </Data>
        </Split>        
    </Entry>
</Root>

XSLT 2.0

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

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Entry">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:for-each-group select="Split" group-by="Data/Num">
        <xsl:copy>
          <xsl:apply-templates select="current-group()"/>
        </xsl:copy>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Split">
    <New_Tag>
      <xsl:apply-templates select="@*|node()"/>
    </New_Tag>
  </xsl:template>

</xsl:stylesheet>

XML 输出

<Root>
   <Entry>
      <Split>
         <New_Tag>
            <Data>
               <Num>20</Num>
               <Type>A</Type>
            </Data>
            <Data>
               <Num>20</Num>
               <Type>A</Type>
            </Data>
            <Data>
               <Num>20</Num>
               <Type>A</Type>
            </Data>
         </New_Tag>
         <New_Tag>
            <Data>
               <Num>20</Num>
               <Type>B</Type>
            </Data>
            <Data>
               <Num>20</Num>
               <Type>B</Type>
            </Data>
         </New_Tag>
      </Split>
      <Split>
         <New_Tag>
            <Data>
               <Num>21</Num>
               <Type>C</Type>
            </Data>
            <Data>
               <Num>21</Num>
               <Type>C</Type>
            </Data>
         </New_Tag>
      </Split>
   </Entry>
</Root>

【讨论】:

以上是关于在 XSLT 中对每个父节点下的子节点进行分组的主要内容,如果未能解决你的问题,请参考以下文章

在xslt中对缺少的表元素进行分组和填充

TreeView 点击触发父节点子节点的连锁反应选中与取消

使用父元素在 XSLT 中拆分/分组

XSLT 1.0 - 连接已知子节点,按未知父节点分组

EasyUI tree 选中父节点子节点全部选中,选中子节点父节点不选中

如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序