通过连接 XSLT 1.0 中的两个字段进行分组

Grouping by concatination of two fields in XSLT 1.0

我遇到了一个我应该完成的任务并尝试了好几天的大麻烦。如果有人能帮助我解决问题,我将不胜感激。

问题

我需要在 XSL 转换 (XSLT 1.0) 中将值组合在一起。当然,我搜索了论坛和网络,所以我发现我必须用 muenchian 分组来做。我无法独自获得它 运行。

用分组值填充字段 YCSSTKLID:

简化来源

<?xml version="1.0" encoding="utf-8"?>
<ns:MT_FlatFile_Lists_Cu xmlns:ns="urn:las:pp:ss1:tar">
<Cu_Records>
    <Record>
        <ESN>123</ESN>
        <GRAPHIC_NAME>1.png</GRAPHIC_NAME>
        <LEVEL_NO>1</LEVEL_NO>
        <CALLOUT></CALLOUT>
    </Record>
    <Record>
        <ESN>123</ESN>
        <GRAPHIC_NAME>2.png</GRAPHIC_NAME>
        <LEVEL_NO>2</LEVEL_NO>
        <CALLOUT></CALLOUT>
    </Record>
    <Record>
        <ESN>123</ESN>
        <GRAPHIC_NAME>2.png</GRAPHIC_NAME>
        <LEVEL_NO>3</LEVEL_NO>
        <CALLOUT>3</CALLOUT>
    </Record>
    <Record>
        <ESN>456</ESN>
        <GRAPHIC_NAME>2.png</GRAPHIC_NAME>
        <LEVEL_NO>1</LEVEL_NO>
        <CALLOUT></CALLOUT>
    </Record>
    <Record>
        <ESN>456</ESN>
        <GRAPHIC_NAME>2.png</GRAPHIC_NAME>
        <LEVEL_NO>2</LEVEL_NO>
        <CALLOUT>17</CALLOUT>
    </Record>
    <Record>
        <ESN>456</ESN>
        <GRAPHIC_NAME>3.png</GRAPHIC_NAME>
        <LEVEL_NO>2</LEVEL_NO>
        <CALLOUT>18</CALLOUT>
    </Record>
</Cu_Records>
</ns:MT_FlatFile_Lists_Cu>

期望的输出

<?xml version="1.0" encoding="UTF-8"?>
<YCSMKO01>
    <IDOC BEGIN="1">
        <EDI_DC40 SEGMENT="1">
            <SNDPOR></SNDPOR>
            <SNDPRT></SNDPRT>
            <SNDPRN></SNDPRN>
            <SNDLAD></SNDLAD>
        </EDI_DC40>
        <YCSMOTOR_KONF01 SEGMENT="1">
            <YCSMOTOR_KONF02 SEGMENT="1">
                <YCSSTKLID>123#1</YCSSTKLID>
            </YCSMOTOR_KONF02>
            <YCSMOTOR_KONF02 SEGMENT="1">
                <YCSSTKLID>123#2</YCSSTKLID>
            </YCSMOTOR_KONF02>
        </YCSMOTOR_KONF01>
    </IDOC>
</YCSMKO01>
<YCSMKO01>
    <IDOC BEGIN="1">
        <EDI_DC40 SEGMENT="1">
            <SNDPOR></SNDPOR>
            <SNDPRT></SNDPRT>
            <SNDPRN></SNDPRN>
            <SNDLAD></SNDLAD>
        </EDI_DC40>
        <YCSMOTOR_KONF01 SEGMENT="1">
            <YCSMOTOR_KONF02 SEGMENT="1">
                <YCSSTKLID>456#2</YCSSTKLID>
            </YCSMOTOR_KONF02>
            <YCSMOTOR_KONF02 SEGMENT="1">
                <YCSSTKLID>456#3</YCSSTKLID>
            </YCSMOTOR_KONF02>
        </YCSMOTOR_KONF01>
    </IDOC>
</YCSMKO01>

简化示例 XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" xmlns:xsltc="http://xml.apache.org/xalan/xsltc" xmlns:map="java.util.Map" xmlns:dyn="com.sap.aii.mapping.api.DynamicConfiguration" xmlns:key="com.sap.aii.mapping.api.DynamicConfigurationKey" xmlns:ns="urn:las:pp:ss1:tar" exclude-result-prefixes="xs ns xsl map key dyn xsltc">
    <xsl:output indent="yes"/>
    <xsl:key name="a" match="Record" use="ESN"/>
    <xsl:key name="grouping" match="/ns:MT_FlatFile_Lists_Cu/Cu_Records/Record" use="concat(./ESN, ./GRAPHIC_NAME)"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/ns:MT_FlatFile_Lists_Cu/Cu_Records/Record[generate-id(.) = generate-id(key('a', ESN))]" mode="head">
        </xsl:apply-templates>
    </xsl:template>
    <!-- IDoc-Struktur -->
    <xsl:template match="Record" mode="head">
        <xsl:param name="pTime"/>
        <xsl:variable name="esn" select="ESN"/>
        <YCSMKO01>
            <IDOC BEGIN="1">
                <EDI_DC40 SEGMENT="1">
                    <SNDPOR></SNDPOR>
                    <SNDPRT></SNDPRT>
                    <SNDPRN></SNDPRN>
                    <SNDLAD></SNDLAD>
                </EDI_DC40>
                <YCSMOTOR_KONF01 SEGMENT="1">
                    <KLU>TBD</KLU>
                    <TYP>TBD</TYP>
                    <YCSMOTOR_KONF02 SEGMENT="1">
                        <YCSSTKLID>
                            <xsl:value-of select="concat(ESN,'#',substring-before(GRAPHIC_NAME, '.'))"/>
                        </YCSSTKLID>
                    </YCSMOTOR_KONF02>
                    <!-- Test Muenchian grouping -->
                    <xsl:for-each select="/ns:MT_FlatFile_Lists_Cu/Cu_Records/Record[generate-id(key('grouping, concat(./ESN, ./GRAPHIC_NAME)))]"/>
                    <YCSMOTOR_KONF02 SEGMENT="1">
                        <YCSSTKLID>
                            <xsl:value-of select="concat(./ESN,'#',substring-before(./GRAPHIC_NAME, '.'))"/>
                        </YCSSTKLID>
                    </YCSMOTOR_KONF02>
                    <!-- End Muenchian -->
                </YCSMOTOR_KONF01>
            </IDOC>
        </YCSMKO01>
    </xsl:template>
</xsl:stylesheet>

非常感谢您。

如果我没猜错,你想做的事情如下:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="urn:las:pp:ss1:tar" 
exclude-result-prefixes="ns">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="rec-by-esn" match="Record" use="ESN"/>
<xsl:key name="rec-by-grf" match="Record" use="concat(ESN, '|', GRAPHIC_NAME)"/>
    
<xsl:template match="/ns:MT_FlatFile_Lists_Cu">
    <root>
        <!-- group by ESN -->
        <xsl:for-each select="Cu_Records/Record[generate-id() = generate-id(key('rec-by-esn', ESN))]">
            <YCSMKO01>
                <IDOC BEGIN="1">
                    <EDI_DC40 SEGMENT="1">
                        <SNDPOR></SNDPOR>
                        <SNDPRT></SNDPRT>
                        <SNDPRN></SNDPRN>
                        <SNDLAD></SNDLAD>
                    </EDI_DC40>
                    <!-- subgroup by ESN and GRAPHIC_NAME -->
                    <xsl:for-each select="key('rec-by-esn', ESN)[generate-id() = generate-id(key('rec-by-grf', concat(ESN, '|', GRAPHIC_NAME)))]">
                        <YCSMOTOR_KONF02 SEGMENT="1">
                            <YCSSTKLID>
                                <xsl:value-of select="concat(ESN,'#',substring-before(GRAPHIC_NAME, '.'))"/>
                            </YCSSTKLID>
                        </YCSMOTOR_KONF02>
                    </xsl:for-each>
                </IDOC>
            </YCSMKO01>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

注意子分组仅应用于当前组的方式,由表达式 key('rec-by-esn', ESN).

选择