在XSLT或之前的sibbling中分组

时间:2016-11-23 13:04:01

标签: xslt

这是我有的xml

<?xml version="1.0" encoding="UTF-8"?>
<Message>
    <CarouselMap>
        <Panel>FLWPB</Panel>
        <Panel>FLWPB</Panel>
        <Panel>FLWBM</Panel>
        <Panel>ALPS</Panel>
        <Panel>MM</Panel>
        <Panel>ACUTE</Panel>
        <Panel>CD10B</Panel>
        <Panel>PNH</Panel>
        <Panel>FLWBM</Panel>
    </CarouselMap>
</Message>

我需要使用

<xsl:for-each-group select="Message/CarouselMap" group-by="Panel">

我需要将FLWPB和FLWBM放在同一组中,其余的放在单独的组中。像这样的东西

        <Panel>FLWPB</Panel>
        <Panel>ALPS</Panel>
        <Panel>MM</Panel>
        <Panel>ACUTE</Panel>
        <Panel>CD10B</Panel>
        <Panel>PNH</Panel>

我可以在每个面板的末尾添加一个后缀,如

<Message>
    <CarouselMap>
        <Panel>FLWPB_AA</Panel>
        <Panel>FLWPB_AA</Panel>
        <Panel>FLWBM_AA</Panel>
        <Panel>ALPS_BB</Panel>
        <Panel>MM_CC</Panel>
        <Panel>ACUTE_DD</Panel>
        <Panel>CD10B_EE</Panel>
        <Panel>PNH_FF</Panel>
        <Panel>FLWBM_AA</Panel>
    </CarouselMap>
</Message>

然后使用

<xsl:for-each-group select="Message/CarouselMap" group-by="substring_after(Panel, '_')">

但我认为可能有更好的方法。您能提供一个提示或更好的解决方案吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您的问题表明您可以操纵源数据。既然如此,我会为每个元素添加一个“分组键”:

<Message>
    <CarouselMap>
        <Panel key="FLW">FLWPB</Panel>
        <Panel key="FLW">FLWPB</Panel>
        <Panel key="FLW">FLWBM</Panel>
        <Panel key="ALPS">ALPS</Panel>
        <Panel key="MM">MM</Panel>
        <Panel key="ACUTE">ACUTE</Panel>
        <Panel key="CD10B">CD10B</Panel>
        <Panel key="PNH">PNH</Panel>
        <Panel key="FLW">FLWBM</Panel>
    </CarouselMap>

现在,使用以下XSLT

  <xsl:output method="xml"/>
  <xsl:template match="/Message/CarouselMap">

    <xsl:for-each-group select="Panel" group-by="@key">
<Panel><xsl:value-of select="."/></Panel>
    </xsl:for-each-group>

  </xsl:template>

为您提供所要求的XML:

<Panel>FLWPB</Panel>
<Panel>ALPS</Panel>
<Panel>MM</Panel>
<Panel>ACUTE</Panel>
<Panel>CD10B</Panel>
<Panel>PNH</Panel>

答案 1 :(得分:0)

  

我需要把FLWPB和FLWBM放在同一组中,其余的都在   分开的小组。

我假设您确实希望将FLWPBFLWBM放在同一个组中,其余的放在单独的中 - 每个不同的值都有一个组。

这可以通过以下方式实现:

<xsl:template match="/Message">
    <root>
        <xsl:for-each-group select="CarouselMap/Panel" group-by="if (. = 'FLWBM') then 'FLWPB' else .">
            <group>
                <xsl:apply-templates select="current-group()"/>
            </group>
        </xsl:for-each-group>
    </root>
</xsl:template>

无需修改原始输入。