需要集合的分组解决方案

时间:2019-11-20 12:29:06

标签: xml xslt xslt-2.0

需要XSL中的分组才能以XML格式输出所需结果

源XML为:

?- marks_chemistry(paul).
Paul got 85/100
true.

必需的输出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>

请为每个循环提供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</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>

1 个答案:

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