【问题标题】:Need a grouping Solution for a Collection需要一个集合的分组解决方案
【发布时间】:2019-11-20 12:29:06
【问题描述】:

需要在 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 中使用此转换。

对于在 cmets 中添加问题,我深表歉意。 需要连接组中重复元素的值。需要保留单个元素以进行重复。需要指导。

需要的输出是

<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>

【问题讨论】:

  • 请提出具体问题。
  • 应用程序不允许我只发布代码。所以我添加了文字。需要将源 xml 转换为目标 xml。需要一个解决方案。
  • “需要解决方案”不是问题。

标签: xml xslt xslt-2.0


【解决方案1】:

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: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>

【讨论】:

  • 谢谢迈克尔。完美运行。您能否验证我通过引用许多博客构建的以下代码。
  • AFAICT 只是(不必要地)更长的时间。
  • 米克,你能帮我连接同一组的重复元素值吗?即 SB100000223Error1 + Error2
  • 请不要在 cmets 中发布代码。编辑您的问题或发布新问题。
  • 我很抱歉。编辑了问题。
猜你喜欢
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2017-10-02
相关资源
最近更新 更多