代码之家  ›  专栏  ›  技术社区  ›  Balaganesh Mohanavel

需要集合的分组解决方案

  •  0
  • Balaganesh Mohanavel  · 技术社区  · 5 年前

    需要XSL中的分组以获得所需的XML输出

    源XML是:

    <DATA_DS>
        <G_REQUEST_ID>3060814</G_REQUEST_ID>
        <LIST_PROJECT_ERROR>
            <PROJECT_ERROR>
                <PROJECT_ERROR_LINE>1</PROJECT_ERROR_LINE>
                <ERROR_PROJECT_NUMBER>SB100000223</ERROR_PROJECT_NUMBER>
                <PROJECT_ERR_MSG>Error1</PROJECT_ERR_MSG>
            </PROJECT_ERROR>
            <PROJECT_ERROR>
                <PROJECT_ERROR_LINE>2</PROJECT_ERROR_LINE>
                <ERROR_PROJECT_NUMBER>SB100000223</ERROR_PROJECT_NUMBER>
                <PROJECT_ERR_MSG>Error2</PROJECT_ERR_MSG>
            </PROJECT_ERROR>
            <PROJECT_ERROR>
                <PROJECT_ERROR_LINE>3</PROJECT_ERROR_LINE>
                <ERROR_PROJECT_NUMBER>SB100000225</ERROR_PROJECT_NUMBER>
                <PROJECT_ERR_MSG>Error5</PROJECT_ERR_MSG>
            </PROJECT_ERROR>
            <PROJECT_ERROR>
                <PROJECT_ERROR_LINE>4</PROJECT_ERROR_LINE>
                <ERROR_PROJECT_NUMBER>SB100000225</ERROR_PROJECT_NUMBER>
                <PROJECT_ERR_MSG>Error6</PROJECT_ERR_MSG>
            </PROJECT_ERROR>
        </LIST_PROJECT_ERROR>
    </DATA_DS>
    

    所需的输出XML为:

    <DATA_DS>
        <G_REQUEST_ID>3060814</G_REQUEST_ID>
        <LIST_PROJECT_ERROR>
            <PROJECT_ERROR>         
                <ERROR_PROJECT_NUMBER>SB100000223</ERROR_PROJECT_NUMBER>
                <PROJECT_ERR_MSG>Error1</PROJECT_ERR_MSG>
                <PROJECT_ERR_MSG>Error2</PROJECT_ERR_MSG>
            </PROJECT_ERROR>
            <PROJECT_ERROR>     
                <ERROR_PROJECT_NUMBER>SB100000225</ERROR_PROJECT_NUMBER>
                <PROJECT_ERR_MSG>Error5</PROJECT_ERR_MSG>
                <PROJECT_ERR_MSG>Error6</PROJECT_ERR_MSG>
            </PROJECT_ERROR>
        </LIST_PROJECT_ERROR>
    </DATA_DS>
    

    请为每个循环提供xsl 2.0。需要在Oracle ICS中使用此转换。

    需要连接组中重复元素的值。需要保留单个元素以进行重复。需要指导。

    <DATA_DS>
        <G_REQUEST_ID>3060814</G_REQUEST_ID>
        <LIST_PROJECT_ERROR>
            <PROJECT_ERROR>         
                <ERROR_PROJECT_NUMBER>SB100000223</ERROR_PROJECT_NUMBER>
                <PROJECT_ERR_MSG>Error1+Error2</PROJECT_ERR_MSG>
            </PROJECT_ERROR>
            <PROJECT_ERROR>     
                <ERROR_PROJECT_NUMBER>SB100000225</ERROR_PROJECT_NUMBER>
                <PROJECT_ERR_MSG>Error5+Error6</PROJECT_ERR_MSG>
            </PROJECT_ERROR>
        </LIST_PROJECT_ERROR>
    </DATA_DS>
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   michael.hor257k    5 年前

    在里面 XSLT2.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:template match="/DATA_DS">
        <xsl:copy>
            <xsl:copy-of select="G_REQUEST_ID"/>
            <LIST_PROJECT_ERROR>
                <xsl:for-each-group select="LIST_PROJECT_ERROR/PROJECT_ERROR" group-by="ERROR_PROJECT_NUMBER">
                    <xsl:copy>
                        <xsl:copy-of select="ERROR_PROJECT_NUMBER"/>
                        <xsl:copy-of select="current-group()/PROJECT_ERR_MSG"/>
                    </xsl:copy>
                </xsl:for-each-group>
            </LIST_PROJECT_ERROR>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    要获得问题补充部分中显示的结果,请更改:

    <xsl:copy-of select="current-group()/PROJECT_ERR_MSG"/>
    

    致:

    <PROJECT_ERR_MSG>
        <xsl:value-of select="current-group()/PROJECT_ERR_MSG" separator="+"/>
    </PROJECT_ERR_MSG>