这是我有的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, '_')">
但我认为可能有更好的方法。您能提供一个提示或更好的解决方案吗? 提前谢谢。
答案 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放在同一组中,其余的都在 分开的小组。
我假设您确实希望将FLWPB
和FLWBM
放在同一个组中,其余的放在单独的组中 - 每个不同的值都有一个组。
这可以通过以下方式实现:
<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>
无需修改原始输入。