使用XSLT在Mule中通过某些特性进行聚合

时间:2013-06-20 20:27:44

标签: xml xslt mule xslt-2.0 mule-studio

我正在使用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转换器?

1 个答案:

答案 0 :(得分: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>