【问题标题】:Grouping Child nodes under each Parent nodes in XSLT在 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' 。将有更多的报告条目。 请帮我解决这个问题。

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

提前致谢。

【问题讨论】:

    标签: xml xslt xslt-2.0 xslt-grouping


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2015-05-15
      • 1970-01-01
      • 2017-12-06
      • 2021-12-05
      • 1970-01-01
      • 2021-03-14
      • 2012-08-07
      • 2017-09-02
      • 1970-01-01
      相关资源
      最近更新 更多