0

我正在使用 Mule 从数据库中提取信息并像这样格式化它 -

<item>
    <id>1</id>
    <group_id>1</group_id>
    <color>blue</color>
    <city>Chicago</city>
</item>

有几条这样的记录,以 id 作为主键,所以我有几条这样的记录,每条记录在不同的 MuleMessage 中。我想按 group_id 分组,所以我的每个 MuleMessages 看起来像这样 -

<item>
    <group_id>1</group_id>
    <id>1</id>
    <id>2</id>
    <id>3</id>
</item>

我知道我必须通过聚合器对消息进行分组,但我不确定如何将 group_id 作为聚合属性。我还需要使用 XSLT 转换器吗?

4

1 回答 1

1

期待这个输入文件

<items>
<item>
    <id>1</id>
    <group_id>1</group_id>
    <color>blue</color>
    <city>Chicago</city>
</item>
<item>
    <id>2</id>
    <group_id>1</group_id>
    <color>red</color>
    <city>Chicago</city>
</item>
<item>
    <id>3</id>
    <group_id>1</group_id>
    <color>yellow</color>
    <city>Detroit</city>
</item>
<item>
    <id>4</id>
    <group_id>2</group_id>
    <color>cyan</color>
    <city>Washington</city>
</item>
<item>
    <id>5</id>
    <group_id>2</group_id>
    <color>gray</color>
    <city>Colorado</city>
</item>
</items>

这个 xslt 可以产生你需要的输出

<xsl:template match="/">
    <xsl:apply-templates select="items" />
</xsl:template>

<xsl:template match="items">
    <xsl:for-each-group select="item" group-by="group_id">
        <xsl:element name="item">
            <xsl:element name="group_id">
                <xsl:value-of select="current-grouping-key()" />
            </xsl:element>
                <xsl:for-each select="current-group()">
                    <xsl:element name="id">
                        <xsl:value-of select="id" />
                    </xsl:element>
                </xsl:for-each>
        </xsl:element>
    </xsl:for-each-group>

</xsl:template>

输出

<item>
    <group_id>1</group_id>
    <id>1</id>
    <id>2</id>
    <id>3</id>
</item>
<item>
    <group_id>2</group_id>
    <id>4</id>
    <id>5</id>
</item>

编辑:如果您没有一个包含所有项目的输入文件,而是更多包含单个项目的文件,您可以通过以下方式执行此操作:

<xsl:variable name="files" select="collection('file:///path/to/files/item*.xml')"/>

<xsl:template match="/">
    <xsl:element name="items">
        <xsl:for-each-group select="$files/item" group-by="group_id">
            <xsl:element name="item">
                <xsl:element name="group_id">
                    <xsl:value-of select="current-grouping-key()" />
                </xsl:element>
                    <xsl:for-each select="current-group()">
                        <xsl:element name="id">
                            <xsl:value-of select="id" />
                        </xsl:element>
                    </xsl:for-each>
            </xsl:element>
        </xsl:for-each-group>
    </xsl:element>
</xsl:template>

于 2013-06-21T06:23:21.020 回答