【问题标题】:Aggregate by certain characteristic in Mule using XSLT使用 XSLT 在 Mule 中按特定特征进行聚合
【发布时间】:2013-06-21 15:12:10
【问题描述】:

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

【问题讨论】:

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


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-30
      • 2022-01-07
      • 2021-07-25
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      相关资源
      最近更新 更多