Группировка XSLT Muenchian из схемы адаптера BizTalk WCF-SQL по идентификатору в группах

Я работаю над приложением BizTalk, которое выполняет типизированный опрос из базы данных с помощью адаптера WCF SQL. Изучив, как сгруппировать данные из сгенерированной схемы в мою каноническую схему, я наткнулся на Мюнхенскую группировку. в качестве общего решения. Однако мне трудно понять, как применить это к моей ситуации.

По сути, данные, которые я опрашиваю, распределены по нескольким таблицам, представляющим собой смесь отношений «один к одному» и «один ко многим», которые используют один и тот же первичный ключ во всех таблицах. Из-за отношений «один ко многим» я не могу извлечь все данные из различных таблиц с помощью одного оператора SELECT и вместо этого решил разделить их как несколько запросов в моем операторе данных опроса, который сгенерировал показанную исходную схему на изображении ниже.

Что я пытаюсь сделать, так это просто отделить все записи из моей исходной схемы по «SharedID» и поместить их в соответствующую запись в моей схеме назначения. (У меня также есть вторичные идентификаторы номеров экземпляров для подгрупп, но я полагаю, что они будут решены таким же образом.) Все примеры, которые я видел, показывают, как это сделать, когда ключ XSLT получен из один узел или несколько узлов из источника схема, но они не показывают, как учитывать, когда один и тот же идентификатор поступает из нескольких узлов.

Я проанализировал примеры из многих источников, насколько это было возможно, но я все еще новичок в XSLT, поэтому мне трудно понять, как настроить мои ключи и операторы for-each для соответствия этому подходу. Любая помощь в демистификации того, как я должен это делать, будет принята с благодарностью. Спасибо!

Вот скриншот карты, использующей обобщенные версии моей структуры схемы источника и назначения.

введите здесь описание изображения

Вот XSLT, созданный приведенной выше картой, который я использую в качестве отправной точки.

<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
                exclude-result-prefixes="msxsl var s0"
                version="1.0"
                xmlns:s0="http://SmallGenericSchemaTest.Schemas/SourceSchema"
                xmlns:ns0="http://SmallGenericSchemaTest.Schemas/DestinationSchema">
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />

    <xsl:template match="/">
        <xsl:apply-templates select="/s0:TypedPolling" />
    </xsl:template>

    <xsl:template match="/s0:TypedPolling">
        <ns0:AllRecords>
            <ns0:SingleRecord>
                <xsl:for-each select="s0:TypedPollingResultSet0">
                    <xsl:for-each select="s0:TypedPollingResultSet0">
                        <ns0:GroupA>
                            <xsl:if test="s0:SharedID">
                                <ns0:SharedID>
                                    <xsl:value-of select="s0:SharedID/text()" />
                                </ns0:SharedID>
                            </xsl:if>

                            <xsl:if test="s0:MiscInfoA1">
                                <ns0:MiscInfoA1>
                                    <xsl:value-of select="s0:MiscInfoA1/text()" />
                                </ns0:MiscInfoA1>
                            </xsl:if>

                            <xsl:if test="s0:MiscInfoA2">
                                <ns0:MiscInfoA2>
                                    <xsl:value-of select="s0:MiscInfoA2/text()" />
                                </ns0:MiscInfoA2>
                            </xsl:if>
                        </ns0:GroupA>
                    </xsl:for-each>
                </xsl:for-each>

                <xsl:for-each select="s0:TypedPollingResultSet1">
                    <xsl:for-each select="s0:TypedPollingResultSet1">
                        <ns0:GroupB>
                            <xsl:if test="s0:MiscInfoB1">
                                <ns0:MiscInfoB1>
                                    <xsl:value-of select="s0:MiscInfoB1/text()" />
                                </ns0:MiscInfoB1>
                            </xsl:if>

                            <xsl:if test="s0:MiscInfoB2">
                                <ns0:MiscInfoB2>
                                    <xsl:value-of select="s0:MiscInfoB2/text()" />
                                </ns0:MiscInfoB2>
                            </xsl:if>

                            <ns0:SubGroupBAContainer>
                                <xsl:for-each select="../../s0:TypedPollingResultSet2">
                                    <xsl:for-each select="s0:TypedPollingResultSet2">
                                        <ns0:SubGroupBA>
                                            <xsl:if test="s0:MiscInfoBA1">
                                                <ns0:MiscInfoBA1>
                                                    <xsl:value-of select="s0:MiscInfoBA1/text()" />
                                                </ns0:MiscInfoBA1>
                                            </xsl:if>

                                            <xsl:if test="s0:MiscInfoBA2">
                                                <ns0:MiscInfoBA2>
                                                    <xsl:value-of select="s0:MiscInfoBA2/text()" />
                                                </ns0:MiscInfoBA2>
                                            </xsl:if>
                                        </ns0:SubGroupBA>
                                    </xsl:for-each>
                                </xsl:for-each>
                            </ns0:SubGroupBAContainer>

                            <ns0:SubGroupBBContainer>
                                <xsl:for-each select="../../s0:TypedPollingResultSet3">
                                    <xsl:for-each select="s0:TypedPollingResultSet3">
                                        <ns0:SubGroupBB>
                                            <xsl:if test="s0:MiscInfoBB1">
                                                <ns0:MiscInfoBB1>
                                                    <xsl:value-of select="s0:MiscInfoBB1/text()" />
                                                </ns0:MiscInfoBB1>
                                            </xsl:if>

                                            <xsl:if test="s0:MiscInfoBB2">
                                                <ns0:MiscInfoBB2>
                                                    <xsl:value-of select="s0:MiscInfoBB2/text()" />
                                                </ns0:MiscInfoBB2>
                                            </xsl:if>
                                        </ns0:SubGroupBB>
                                    </xsl:for-each>
                                </xsl:for-each>
                            </ns0:SubGroupBBContainer>
                        </ns0:GroupB>
                    </xsl:for-each>
                </xsl:for-each>

                <ns0:GroupCContainer>
                    <xsl:for-each select="s0:TypedPollingResultSet4">
                        <xsl:for-each select="s0:TypedPollingResultSet4">
                            <ns0:GroupC>
                                <xsl:if test="s0:GroupCInstanceID">
                                    <ns0:GroupCInstanceID>
                                        <xsl:value-of select="s0:GroupCInstanceID/text()" />
                                    </ns0:GroupCInstanceID>
                                </xsl:if>

                                <xsl:if test="s0:MiscInfoC1">
                                    <ns0:MiscInfoC1>
                                        <xsl:value-of select="s0:MiscInfoC1/text()" />
                                    </ns0:MiscInfoC1>
                                </xsl:if>

                                <xsl:if test="s0:MiscInfoC2">
                                    <ns0:MiscInfoC2>
                                        <xsl:value-of select="s0:MiscInfoC2/text()" />
                                    </ns0:MiscInfoC2>
                                </xsl:if>
                            </ns0:GroupC>
                        </xsl:for-each>
                    </xsl:for-each>
                </ns0:GroupCContainer>

                <ns0:GroupDContainer>
                    <xsl:for-each select="s0:TypedPollingResultSet5">
                        <xsl:for-each select="s0:TypedPollingResultSet5">
                            <ns0:GroupD>
                                <xsl:if test="s0:GroupDInstanceID">
                                    <ns0:GroupDInstanceID>
                                        <xsl:value-of select="s0:GroupDInstanceID/text()" />
                                    </ns0:GroupDInstanceID>
                                </xsl:if>

                                <xsl:if test="s0:MiscInfoD1">
                                    <ns0:MiscInfoD1>
                                        <xsl:value-of select="s0:MiscInfoD1/text()" />
                                    </ns0:MiscInfoD1>
                                </xsl:if>

                                <xsl:if test="s0:MiscInfoD2">
                                    <ns0:MiscInfoD2>
                                        <xsl:value-of select="s0:MiscInfoD2/text()" />
                                    </ns0:MiscInfoD2>
                                </xsl:if>
                                <xsl:for-each select="../../s0:TypedPollingResultSet6">
                                    <xsl:for-each select="s0:TypedPollingResultSet6">
                                        <ns0:SubGroupDA>
                                            <xsl:if test="s0:MiscInfoDA1">
                                                <ns0:MiscInfoDA1>
                                                    <xsl:value-of select="s0:MiscInfoDA1/text()" />
                                                </ns0:MiscInfoDA1>
                                            </xsl:if>

                                            <xsl:if test="s0:MiscInfoDA2">
                                                <ns0:MiscInfoDA2>
                                                    <xsl:value-of select="s0:MiscInfoDA2/text()" />
                                                </ns0:MiscInfoDA2>
                                            </xsl:if>
                                        </ns0:SubGroupDA>
                                    </xsl:for-each>
                                </xsl:for-each>

                                <ns0:SubGroupDBContainer>
                                    <xsl:for-each select="../../s0:TypedPollingResultSet7">
                                        <xsl:for-each select="s0:TypedPollingResultSet7">
                                            <ns0:SubGroupDB>
                                                <xsl:if test="s0:MiscInfoDB1">
                                                    <ns0:MiscInfoDB1>
                                                        <xsl:value-of select="s0:MiscInfoDB1/text()" />
                                                    </ns0:MiscInfoDB1>
                                                </xsl:if>

                                                <xsl:if test="s0:MiscInfoDB2">
                                                    <ns0:MiscInfoDB2>
                                                        <xsl:value-of select="s0:MiscInfoDB2/text()" />
                                                    </ns0:MiscInfoDB2>
                                                </xsl:if>
                                            </ns0:SubGroupDB>
                                        </xsl:for-each>
                                    </xsl:for-each>
                                </ns0:SubGroupDBContainer>
                            </ns0:GroupD>
                        </xsl:for-each>
                    </xsl:for-each>
                </ns0:GroupDContainer>
            </ns0:SingleRecord>
        </ns0:AllRecords>
    </xsl:template>
</xsl:stylesheet>

ИЗМЕНИТЬ:

Вот пример входного XML-документа и желаемый результат.

Пример ввода:

<ns0:TypedPolling xmlns:ns0="http://SmallGenericSchemaTest.Schemas/SourceSchema">
    <ns0:TypedPollingResultSet0>
        <ns0:TypedPollingResultSet0>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:MiscInfoA1>A1_1</ns0:MiscInfoA1>
            <ns0:MiscInfoA2>A2_1</ns0:MiscInfoA2>
        </ns0:TypedPollingResultSet0>

        <ns0:TypedPollingResultSet0>
            <ns0:SharedID>SharedID_2</ns0:SharedID>
            <ns0:MiscInfoA1>A1_2</ns0:MiscInfoA1>
            <ns0:MiscInfoA2>A2_2</ns0:MiscInfoA2>
        </ns0:TypedPollingResultSet0>
    </ns0:TypedPollingResultSet0>

    <ns0:TypedPollingResultSet1>
        <ns0:TypedPollingResultSet1>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:MiscInfoB1>B1_1</ns0:MiscInfoB1>
            <ns0:MiscInfoB2>B2_1</ns0:MiscInfoB2>
        </ns0:TypedPollingResultSet1>

        <ns0:TypedPollingResultSet1>
            <ns0:SharedID>SharedID_2</ns0:SharedID>
            <ns0:MiscInfoB1>B1_2</ns0:MiscInfoB1>
            <ns0:MiscInfoB2>B2_2</ns0:MiscInfoB2>
        </ns0:TypedPollingResultSet1>
    </ns0:TypedPollingResultSet1>

    <ns0:TypedPollingResultSet2>
        <ns0:TypedPollingResultSet2>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:MiscInfoBA1>BA1_1A</ns0:MiscInfoBA1>
            <ns0:MiscInfoBA2>BA2_1A</ns0:MiscInfoBA2>
        </ns0:TypedPollingResultSet2>

        <ns0:TypedPollingResultSet2>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:MiscInfoBA1>BA1_1B</ns0:MiscInfoBA1>
            <ns0:MiscInfoBA2>BA2_1B</ns0:MiscInfoBA2>
        </ns0:TypedPollingResultSet2>

        <ns0:TypedPollingResultSet2>
            <ns0:SharedID>SharedID_2</ns0:SharedID>
            <ns0:MiscInfoBA1>BA1_2A</ns0:MiscInfoBA1>
            <ns0:MiscInfoBA2>BA2_2A</ns0:MiscInfoBA2>
        </ns0:TypedPollingResultSet2>

        <ns0:TypedPollingResultSet2>
            <ns0:SharedID>SharedID_2</ns0:SharedID>
            <ns0:MiscInfoBA1>BA1_2B</ns0:MiscInfoBA1>
            <ns0:MiscInfoBA2>BA2_2B</ns0:MiscInfoBA2>
        </ns0:TypedPollingResultSet2>
    </ns0:TypedPollingResultSet2>

    <ns0:TypedPollingResultSet3>
        <ns0:TypedPollingResultSet3>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:MiscInfoBB1>BB1_1A</ns0:MiscInfoBB1>
            <ns0:MiscInfoBB2>BB2_1A</ns0:MiscInfoBB2>
        </ns0:TypedPollingResultSet3>

        <ns0:TypedPollingResultSet3>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:MiscInfoBB1>BB1_1B</ns0:MiscInfoBB1>
            <ns0:MiscInfoBB2>BB2_1B</ns0:MiscInfoBB2>
        </ns0:TypedPollingResultSet3>

        <ns0:TypedPollingResultSet3>
            <ns0:SharedID>SharedID_2</ns0:SharedID>
            <ns0:MiscInfoBB1>BB1_2</ns0:MiscInfoBB1>
            <ns0:MiscInfoBB2>BB2_2</ns0:MiscInfoBB2>
        </ns0:TypedPollingResultSet3>
    </ns0:TypedPollingResultSet3>

    <ns0:TypedPollingResultSet4>
        <ns0:TypedPollingResultSet4>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:GroupCInstanceID>GroupCInstanceID_1A</ns0:GroupCInstanceID>
            <ns0:MiscInfoC1>C1_1A</ns0:MiscInfoC1>
            <ns0:MiscInfoC2>C2_1A</ns0:MiscInfoC2>
        </ns0:TypedPollingResultSet4>

        <ns0:TypedPollingResultSet4>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:GroupCInstanceID>GroupCInstanceID_1B</ns0:GroupCInstanceID>
            <ns0:MiscInfoC1>C1_1B</ns0:MiscInfoC1>
            <ns0:MiscInfoC2>C2_1B</ns0:MiscInfoC2>
        </ns0:TypedPollingResultSet4>

        <ns0:TypedPollingResultSet4>
            <ns0:SharedID>SharedID_2</ns0:SharedID>
            <ns0:GroupCInstanceID>GroupCInstanceID_2</ns0:GroupCInstanceID>
            <ns0:MiscInfoC1>C1_2</ns0:MiscInfoC1>
            <ns0:MiscInfoC2>C2_2</ns0:MiscInfoC2>
        </ns0:TypedPollingResultSet4>
    </ns0:TypedPollingResultSet4>

    <ns0:TypedPollingResultSet5>
        <ns0:TypedPollingResultSet5>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:GroupDInstanceID>GroupDInstanceID_1A</ns0:GroupDInstanceID>
            <ns0:MiscInfoD1>D1_1A</ns0:MiscInfoD1>
            <ns0:MiscInfoD2>D2_1A</ns0:MiscInfoD2>
        </ns0:TypedPollingResultSet5>

        <ns0:TypedPollingResultSet5>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:GroupDInstanceID>GroupDInstanceID_1B</ns0:GroupDInstanceID>
            <ns0:MiscInfoD1>D1_1B</ns0:MiscInfoD1>
            <ns0:MiscInfoD2>D2_1B</ns0:MiscInfoD2>
        </ns0:TypedPollingResultSet5>

        <ns0:TypedPollingResultSet5>
            <ns0:SharedID>SharedID_2</ns0:SharedID>
            <ns0:GroupDInstanceID>GroupDInstanceID_2</ns0:GroupDInstanceID>
            <ns0:MiscInfoD1>D1_2</ns0:MiscInfoD1>
            <ns0:MiscInfoD2>D2_2</ns0:MiscInfoD2>
        </ns0:TypedPollingResultSet5>
    </ns0:TypedPollingResultSet5>

    <ns0:TypedPollingResultSet6>
        <ns0:TypedPollingResultSet6>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:GroupDInstanceID>GroupDInstanceID_1A</ns0:GroupDInstanceID>
            <ns0:MiscInfoDA1>DA1_1A</ns0:MiscInfoDA1>
            <ns0:MiscInfoDA2>DA2_1A</ns0:MiscInfoDA2>
        </ns0:TypedPollingResultSet6>

        <ns0:TypedPollingResultSet6>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:GroupDInstanceID>GroupDInstanceID_1B</ns0:GroupDInstanceID>
            <ns0:MiscInfoDA1>DA1_1B</ns0:MiscInfoDA1>
            <ns0:MiscInfoDA2>DA2_1B</ns0:MiscInfoDA2>
        </ns0:TypedPollingResultSet6>

        <ns0:TypedPollingResultSet6>
            <ns0:SharedID>SharedID_2</ns0:SharedID>
            <ns0:GroupDInstanceID>GroupDInstanceID_2</ns0:GroupDInstanceID>
            <ns0:MiscInfoDA1>DA1_2</ns0:MiscInfoDA1>
            <ns0:MiscInfoDA2>DA2_2</ns0:MiscInfoDA2>
        </ns0:TypedPollingResultSet6>
    </ns0:TypedPollingResultSet6>

    <ns0:TypedPollingResultSet7>
        <ns0:TypedPollingResultSet7>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:GroupDInstanceID>GroupDInstanceID_1A</ns0:GroupDInstanceID>
            <ns0:MiscInfoDB1>DB1_1A</ns0:MiscInfoDB1>
            <ns0:MiscInfoDB2>DB2_1A</ns0:MiscInfoDB2>
        </ns0:TypedPollingResultSet7>

        <ns0:TypedPollingResultSet7>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:GroupDInstanceID>GroupDInstanceID_1B</ns0:GroupDInstanceID>
            <ns0:MiscInfoDB1>DB1_1B</ns0:MiscInfoDB1>
            <ns0:MiscInfoDB2>DB2_1B</ns0:MiscInfoDB2>
        </ns0:TypedPollingResultSet7>

        <ns0:TypedPollingResultSet7>
            <ns0:SharedID>SharedID_2</ns0:SharedID>
            <ns0:GroupDInstanceID>GroupDInstanceID_2</ns0:GroupDInstanceID>
            <ns0:MiscInfoDB1>DB1_2</ns0:MiscInfoDB1>
            <ns0:MiscInfoDB2>DB2_2</ns0:MiscInfoDB2>
        </ns0:TypedPollingResultSet7>
    </ns0:TypedPollingResultSet7>
</ns0:TypedPolling>

Желаемый результат:

<ns0:AllRecords xmlns:ns0="http://SmallGenericSchemaTest.Schemas/DestinationSchema">
    <ns0:SingleRecord>
        <ns0:GroupA>
            <ns0:SharedID>SharedID_1</ns0:SharedID>
            <ns0:MiscInfoA1>A1_1</ns0:MiscInfoA1>
            <ns0:MiscInfoA2>A2_1</ns0:MiscInfoA2>
        </ns0:GroupA>

        <ns0:GroupB>
            <ns0:MiscInfoB1>B1_1</ns0:MiscInfoB1>
            <ns0:MiscInfoB2>B2_1</ns0:MiscInfoB2>

            <ns0:SubGroupBAContainer>
                <ns0:SubGroupBA>
                    <ns0:MiscInfoBA1>BA1_1A</ns0:MiscInfoBA1>
                    <ns0:MiscInfoBA2>BA2_1A</ns0:MiscInfoBA2>
                </ns0:SubGroupBA>

                <ns0:SubGroupBA>
                    <ns0:MiscInfoBA1>BA1_1B</ns0:MiscInfoBA1>
                    <ns0:MiscInfoBA2>BA2_1B</ns0:MiscInfoBA2>
                </ns0:SubGroupBA>
            </ns0:SubGroupBAContainer>

            <ns0:SubGroupBBContainer>
                <ns0:SubGroupBB>
                    <ns0:MiscInfoBB1>BB1_1A</ns0:MiscInfoBB1>
                    <ns0:MiscInfoBB2>BB2_1A</ns0:MiscInfoBB2>
                </ns0:SubGroupBB>

                <ns0:SubGroupBB>
                    <ns0:MiscInfoBB1>BB1_1B</ns0:MiscInfoBB1>
                    <ns0:MiscInfoBB2>BB2_1B</ns0:MiscInfoBB2>
                </ns0:SubGroupBB>
            </ns0:SubGroupBBContainer>
        </ns0:GroupB>

        <ns0:GroupCContainer>
            <ns0:GroupC>
                <ns0:GroupCInstanceID>GroupCInstanceID_1A</ns0:GroupCInstanceID>
                <ns0:MiscInfoC1>C1_1A</ns0:MiscInfoC1>
                <ns0:MiscInfoC2>C2_1A</ns0:MiscInfoC2>
            </ns0:GroupC>

            <ns0:GroupC>
                <ns0:GroupCInstanceID>GroupCInstanceID_1B</ns0:GroupCInstanceID>
                <ns0:MiscInfoC1>C1_1B</ns0:MiscInfoC1>
                <ns0:MiscInfoC2>C2_1B</ns0:MiscInfoC2>
            </ns0:GroupC>
        </ns0:GroupCContainer>

        <ns0:GroupDContainer>
            <ns0:GroupD>
                <ns0:GroupDInstanceID>GroupDInstanceID_1A</ns0:GroupDInstanceID>
                <ns0:MiscInfoD1>D1_1A</ns0:MiscInfoD1>
                <ns0:MiscInfoD2>D2_1A</ns0:MiscInfoD2>

                <ns0:SubGroupDA>
                    <ns0:MiscInfoDA1>DA1_1A</ns0:MiscInfoDA1>
                    <ns0:MiscInfoDA2>DA2_1A</ns0:MiscInfoDA2>
                </ns0:SubGroupDA>

                <ns0:SubGroupDBContainer>
                    <ns0:SubGroupDB>
                        <ns0:MiscInfoDB1>DB1_1A</ns0:MiscInfoDB1>
                        <ns0:MiscInfoDB2>DB2_1A</ns0:MiscInfoDB2>
                    </ns0:SubGroupDB>
                </ns0:SubGroupDBContainer>
            </ns0:GroupD>

            <ns0:GroupD>
                <ns0:GroupDInstanceID>GroupDInstanceID_1B</ns0:GroupDInstanceID>
                <ns0:MiscInfoD1>D1_1B</ns0:MiscInfoD1>
                <ns0:MiscInfoD2>D2_1B</ns0:MiscInfoD2>

                <ns0:SubGroupDA>
                    <ns0:MiscInfoDA1>DA1_1B</ns0:MiscInfoDA1>
                    <ns0:MiscInfoDA2>DA2_1B</ns0:MiscInfoDA2>
                </ns0:SubGroupDA>

                <ns0:SubGroupDBContainer>
                    <ns0:SubGroupDB>
                        <ns0:MiscInfoDB1>DB1_1B</ns0:MiscInfoDB1>
                        <ns0:MiscInfoDB2>DB2_1B</ns0:MiscInfoDB2>
                    </ns0:SubGroupDB>
                </ns0:SubGroupDBContainer>
            </ns0:GroupD>
        </ns0:GroupDContainer>
    </ns0:SingleRecord>

    <ns0:SingleRecord>
        <ns0:GroupA>
            <ns0:SharedID>SharedID_2</ns0:SharedID>
            <ns0:MiscInfoA1>A1_2</ns0:MiscInfoA1>
            <ns0:MiscInfoA2>A2_2</ns0:MiscInfoA2>
        </ns0:GroupA>

        <ns0:GroupB>
            <ns0:MiscInfoB1>B1_2</ns0:MiscInfoB1>
            <ns0:MiscInfoB2>B2_2</ns0:MiscInfoB2>

            <ns0:SubGroupBAContainer>
                <ns0:SubGroupBA>
                    <ns0:MiscInfoBA1>BA1_2A</ns0:MiscInfoBA1>
                    <ns0:MiscInfoBA2>BA2_2A</ns0:MiscInfoBA2>
                </ns0:SubGroupBA>

                <ns0:SubGroupBA>
                    <ns0:MiscInfoBA1>BA1_2B</ns0:MiscInfoBA1>
                    <ns0:MiscInfoBA2>BA2_2B</ns0:MiscInfoBA2>
                </ns0:SubGroupBA>
            </ns0:SubGroupBAContainer>

            <ns0:SubGroupBBContainer>
                <ns0:SubGroupBB>
                    <ns0:MiscInfoBB1>BB1_2</ns0:MiscInfoBB1>
                    <ns0:MiscInfoBB2>BB2_2</ns0:MiscInfoBB2>
                </ns0:SubGroupBB>
            </ns0:SubGroupBBContainer>
        </ns0:GroupB>

        <ns0:GroupCContainer>
            <ns0:GroupC>
                <ns0:GroupCInstanceID>GroupCInstanceID_2</ns0:GroupCInstanceID>
                <ns0:MiscInfoC1>C1_2</ns0:MiscInfoC1>
                <ns0:MiscInfoC2>C2_2</ns0:MiscInfoC2>
            </ns0:GroupC>
        </ns0:GroupCContainer>

        <ns0:GroupDContainer>
            <ns0:GroupD>
                <ns0:GroupDInstanceID>GroupDInstanceID_2</ns0:GroupDInstanceID>
                <ns0:MiscInfoD1>D1_2</ns0:MiscInfoD1>
                <ns0:MiscInfoD2>D2_2</ns0:MiscInfoD2>

                <ns0:SubGroupDA>
                    <ns0:MiscInfoDA1>DA1_2</ns0:MiscInfoDA1>
                    <ns0:MiscInfoDA2>DA2_2</ns0:MiscInfoDA2>
                </ns0:SubGroupDA>

                <ns0:SubGroupDBContainer>
                    <ns0:SubGroupDB>
                        <ns0:MiscInfoDB1>DB1_2</ns0:MiscInfoDB1>
                        <ns0:MiscInfoDB2>DB2_2</ns0:MiscInfoDB2>
                    </ns0:SubGroupDB>
                </ns0:SubGroupDBContainer>
            </ns0:GroupD>
        </ns0:GroupDContainer>
    </ns0:SingleRecord>
</ns0:AllRecords>

person NspectorHector    schedule 02.09.2016    source источник
comment
Без образца полезной нагрузки людям немного сложно воспроизвести. Вы можете добавить это? Также поможет выделение текущего результата по сравнению с тем, что вы хотите.   -  person Dijkgraaf    schedule 03.09.2016
comment
Вы пробовали запрос FOR XML? В этом случае SQL Server позаботится обо всей группировке за вас.   -  person Johns-305    schedule 05.09.2016
comment
На самом деле, очень важно, это может быть не мюнхенским случаем. Является ли SharedID в TypedPollingResultSet0 уникальным для каждого набора результатов? Если да, то это не мюнхенский случай, и все становится намного проще.   -  person Johns-305    schedule 05.09.2016
comment
Дийкграаф, это хорошая мысль. Я добавил образец ввода и желаемый вывод.   -  person NspectorHector    schedule 06.09.2016
comment
Johns-305, мы использовали FOR XML в прошлом, но в конечном итоге сценарии представляют собой несколько тысяч строк, генерирующих XML вручную. Я избегаю этого в надежде найти лучший способ, который привел меня к этому подходу. Что касается вопроса о SharedID в TypedPollingResultSet0, да, он уникален для каждого набора результатов. Вы говорите, что я должен иметь возможность просто использовать элементы for-each, не прибегая к назначению ключей?   -  person NspectorHector    schedule 06.09.2016


Ответы (1)


Согласно предложению Johns-305, я рассмотрел альтернативы мюнхианской группировке и пришел к приведенному ниже решению, которое, похоже, работает так, как предполагалось. Похоже, что после знакомства с мюнхенским методом я наделил себя узким кругозором. Конечный результат оказался намного проще, но моя неопытность с XSLT сделала его менее очевидным.

Конечно, если кто-то знает лучший способ сделать это или видит возможности для улучшения, не стесняйтесь вносить дополнительные предложения. Я оставлю вопрос открытым в течение нескольких дней, прежде чем принять этот ответ на случай, если появится лучший. Спасибо!

<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
                exclude-result-prefixes="msxsl var s0"
                version="1.0"
                xmlns:s0="http://SmallGenericSchemaTest.Schemas/SourceSchema"
                xmlns:ns0="http://SmallGenericSchemaTest.Schemas/DestinationSchema">
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />

    <xsl:template match="/">
        <xsl:apply-templates select="/s0:TypedPolling" />
    </xsl:template>

    <xsl:template match="/s0:TypedPolling">
        <ns0:AllRecords>
            <xsl:for-each select="s0:TypedPollingResultSet0/s0:TypedPollingResultSet0">
                <ns0:SingleRecord>

                    <ns0:GroupA>
                        <xsl:if test="s0:SharedID">
                            <ns0:SharedID>
                                <xsl:value-of select="s0:SharedID/text()" />
                            </ns0:SharedID>
                        </xsl:if>

                        <xsl:if test="s0:MiscInfoA1">
                            <ns0:MiscInfoA1>
                                <xsl:value-of select="s0:MiscInfoA1/text()" />
                            </ns0:MiscInfoA1>
                        </xsl:if>

                        <xsl:if test="s0:MiscInfoA2">
                            <ns0:MiscInfoA2>
                                <xsl:value-of select="s0:MiscInfoA2/text()" />
                            </ns0:MiscInfoA2>
                        </xsl:if>
                    </ns0:GroupA>


                    <xsl:for-each select="/s0:TypedPolling/s0:TypedPollingResultSet1/s0:TypedPollingResultSet1[s0:SharedID = current()/s0:SharedID]">
                        <ns0:GroupB>
                            <xsl:if test="s0:MiscInfoB1">
                                <ns0:MiscInfoB1>
                                    <xsl:value-of select="s0:MiscInfoB1/text()" />
                                </ns0:MiscInfoB1>
                            </xsl:if>

                            <xsl:if test="s0:MiscInfoB2">
                                <ns0:MiscInfoB2>
                                    <xsl:value-of select="s0:MiscInfoB2/text()" />
                                </ns0:MiscInfoB2>
                            </xsl:if>

                            <ns0:SubGroupBAContainer>
                                <xsl:for-each select="/s0:TypedPolling/s0:TypedPollingResultSet2/s0:TypedPollingResultSet2[s0:SharedID = current()/s0:SharedID]">
                                    <ns0:SubGroupBA>
                                        <xsl:if test="s0:MiscInfoBA1">
                                            <ns0:MiscInfoBA1>
                                                <xsl:value-of select="s0:MiscInfoBA1/text()" />
                                            </ns0:MiscInfoBA1>
                                        </xsl:if>

                                        <xsl:if test="s0:MiscInfoBA2">
                                            <ns0:MiscInfoBA2>
                                                <xsl:value-of select="s0:MiscInfoBA2/text()" />
                                            </ns0:MiscInfoBA2>
                                        </xsl:if>
                                    </ns0:SubGroupBA>
                                </xsl:for-each>
                            </ns0:SubGroupBAContainer>

                            <ns0:SubGroupBBContainer>
                                <xsl:for-each select="/s0:TypedPolling/s0:TypedPollingResultSet3/s0:TypedPollingResultSet3[s0:SharedID = current()/s0:SharedID]">
                                    <ns0:SubGroupBB>
                                        <xsl:if test="s0:MiscInfoBB1">
                                            <ns0:MiscInfoBB1>
                                                <xsl:value-of select="s0:MiscInfoBB1/text()" />
                                            </ns0:MiscInfoBB1>
                                        </xsl:if>

                                        <xsl:if test="s0:MiscInfoBB2">
                                            <ns0:MiscInfoBB2>
                                                <xsl:value-of select="s0:MiscInfoBB2/text()" />
                                            </ns0:MiscInfoBB2>
                                        </xsl:if>
                                    </ns0:SubGroupBB>
                                </xsl:for-each>
                            </ns0:SubGroupBBContainer>
                        </ns0:GroupB>
                    </xsl:for-each>


                    <xsl:if test="/s0:TypedPolling/s0:TypedPollingResultSet4/s0:TypedPollingResultSet4[s0:SharedID = current()/s0:SharedID]">
                        <ns0:GroupCContainer>
                            <xsl:for-each select="/s0:TypedPolling/s0:TypedPollingResultSet4/s0:TypedPollingResultSet4[s0:SharedID = current()/s0:SharedID]">
                                <ns0:GroupC>
                                    <xsl:if test="s0:GroupCInstanceID">
                                        <ns0:GroupCInstanceID>
                                            <xsl:value-of select="s0:GroupCInstanceID/text()" />
                                        </ns0:GroupCInstanceID>
                                    </xsl:if>

                                    <xsl:if test="s0:MiscInfoC1">
                                        <ns0:MiscInfoC1>
                                            <xsl:value-of select="s0:MiscInfoC1/text()" />
                                        </ns0:MiscInfoC1>
                                    </xsl:if>

                                    <xsl:if test="s0:MiscInfoC2">
                                        <ns0:MiscInfoC2>
                                            <xsl:value-of select="s0:MiscInfoC2/text()" />
                                        </ns0:MiscInfoC2>
                                    </xsl:if>
                                </ns0:GroupC>
                            </xsl:for-each>
                        </ns0:GroupCContainer>
                    </xsl:if>


                    <xsl:if test="/s0:TypedPolling/s0:TypedPollingResultSet5/s0:TypedPollingResultSet5[s0:SharedID = current()/s0:SharedID]">
                        <ns0:GroupDContainer>
                            <xsl:for-each select="/s0:TypedPolling/s0:TypedPollingResultSet5/s0:TypedPollingResultSet5[s0:SharedID = current()/s0:SharedID]">
                                <ns0:GroupD>
                                    <xsl:if test="s0:GroupDInstanceID">
                                        <ns0:GroupDInstanceID>
                                            <xsl:value-of select="s0:GroupDInstanceID/text()" />
                                        </ns0:GroupDInstanceID>
                                    </xsl:if>

                                    <xsl:if test="s0:MiscInfoD1">
                                        <ns0:MiscInfoD1>
                                            <xsl:value-of select="s0:MiscInfoD1/text()" />
                                        </ns0:MiscInfoD1>
                                    </xsl:if>

                                    <xsl:if test="s0:MiscInfoD2">
                                        <ns0:MiscInfoD2>
                                            <xsl:value-of select="s0:MiscInfoD2/text()" />
                                        </ns0:MiscInfoD2>
                                    </xsl:if>

                                    <xsl:if test="/s0:TypedPolling/s0:TypedPollingResultSet6/s0:TypedPollingResultSet6[s0:SharedID = current()/s0:SharedID]
                                            and /s0:TypedPolling/s0:TypedPollingResultSet6/s0:TypedPollingResultSet6[s0:GroupDInstanceID = current()/s0:GroupDInstanceID]">
                                        <xsl:for-each select="/s0:TypedPolling/s0:TypedPollingResultSet6/s0:TypedPollingResultSet6[s0:SharedID = current()/s0:SharedID
                                                      and s0:GroupDInstanceID = current()/s0:GroupDInstanceID]">
                                            <ns0:SubGroupDA>
                                                <xsl:if test="s0:MiscInfoDA1">
                                                    <ns0:MiscInfoDA1>
                                                        <xsl:value-of select="s0:MiscInfoDA1/text()" />
                                                    </ns0:MiscInfoDA1>
                                                </xsl:if>

                                                <xsl:if test="s0:MiscInfoDA2">
                                                    <ns0:MiscInfoDA2>
                                                        <xsl:value-of select="s0:MiscInfoDA2/text()" />
                                                    </ns0:MiscInfoDA2>
                                                </xsl:if>
                                            </ns0:SubGroupDA>
                                        </xsl:for-each>
                                    </xsl:if>

                                    <xsl:if test="/s0:TypedPolling/s0:TypedPollingResultSet7/s0:TypedPollingResultSet7[s0:SharedID = current()/s0:SharedID]
                                            and /s0:TypedPolling/s0:TypedPollingResultSet7/s0:TypedPollingResultSet7[s0:GroupDInstanceID = current()/s0:GroupDInstanceID]">
                                        <ns0:SubGroupDBContainer>
                                            <xsl:for-each select="/s0:TypedPolling/s0:TypedPollingResultSet7/s0:TypedPollingResultSet7[s0:SharedID = current()/s0:SharedID
                                                          and s0:GroupDInstanceID = current()/s0:GroupDInstanceID]">
                                                <ns0:SubGroupDB>
                                                    <xsl:if test="s0:MiscInfoDB1">
                                                        <ns0:MiscInfoDB1>
                                                            <xsl:value-of select="s0:MiscInfoDB1/text()" />
                                                        </ns0:MiscInfoDB1>
                                                    </xsl:if>

                                                    <xsl:if test="s0:MiscInfoDB2">
                                                        <ns0:MiscInfoDB2>
                                                            <xsl:value-of select="s0:MiscInfoDB2/text()" />
                                                        </ns0:MiscInfoDB2>
                                                    </xsl:if>
                                                </ns0:SubGroupDB>
                                            </xsl:for-each>
                                        </ns0:SubGroupDBContainer>
                                    </xsl:if>
                                </ns0:GroupD>
                            </xsl:for-each>
                        </ns0:GroupDContainer>
                    </xsl:if>

                </ns0:SingleRecord>
            </xsl:for-each>
        </ns0:AllRecords>
    </xsl:template>
</xsl:stylesheet>
person NspectorHector    schedule 06.09.2016