XSLT различные узлы объединяются - PullRequest
0 голосов
/ 10 октября 2018

У меня есть один файл xslt, и я хочу объединить разные страны для одного и того же имени клиента через запятую.Для одного и того же клиента может быть много стран.Поэтому я хочу объединить все страны для одного и того же клиента.Ниже мой образец xml:

<ClientReferences>
    <ClientReference>
        <ClientName>ABCDEF PVT. LTD</ClientName>
        <ClientCountry>India</ClientCountry>
    </ClientReference>
    <ClientReference>
        <ClientName>ABCDEF PVT. LTD</ClientName>
        <ClientCountry>China</ClientCountry>
    </ClientReference>
    <ClientReference>
        <ClientName>ABCDEF PVT. LTD</ClientName>
        <ClientCountry>USA</ClientCountry>
    </ClientReference>
    <ClientReference >
        <ClientName>XYZ LIMITED</ClientName>
        <ClientCountry>China</ClientCountry>
    </ClientReference>
</ClientReferences>

Я хочу, чтобы результат был:

<ClientReferences>
    <ClientReference>
        <ClientName>ABCDEF PVT. LTD</ClientName>
        <ClientCountry>India,China,USA</ClientCountry>
    </ClientReference>
    <ClientReference>
        <ClientName>XYZ LIMITED</ClientName>
        <ClientCountry>China</ClientCountry>
    </ClientReference>
</ClientReferences>

Ниже мой код xslt:

 <?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/Sections">
        <Sections>
            <ClientReferences>
                <xsl:for-each select="Section/ClientReferences/ClientReference[generate-id() = generate-id(key('sameClient', ClientName)[1])]">
                    <ClientReference>
                        <ClientName>
                            <xsl:value-of select="ClientName"/>
                        </ClientName>
                        <ClientCountry>
                            <xsl:for-each select="ClientName">
                                <xsl:value-of select="ClientCountry"/>
                                <xsl:if test="position() != last()">
                                    <xsl:text>,</xsl:text>
                                </xsl:if>
                            </xsl:for-each>
                        </ClientCountry>
                    </ClientReference>
                </xsl:for-each>
            </ClientReferences>
        </Sections>
    </xsl:template>
</xsl:stylesheet>

1 Ответ

0 голосов
/ 10 октября 2018

Используйте XSLT 2.0 для каждой группы как:

<xsl:template match="ClientReferences">
    <xsl:copy>
        <xsl:for-each-group select="ClientReference" group-by="ClientName">
            <xsl:copy>
                <ClientName><xsl:value-of select="ClientName"/></ClientName>
                <ClientCountry><xsl:value-of select="current-group()/ClientCountry" separator=","/></ClientCountry>
            </xsl:copy>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

См. Преобразование в https://xsltfiddle.liberty -development.net / bFDb2CX

В XSLT 1.0 по мюнхенскому методу

<xsl:key name="sameClient" match="ClientReference" use="ClientName"/>
<xsl:template match="ClientReferences">
        <ClientReferences>
            <xsl:for-each select="ClientReference[generate-id(.) = generate-id(key('sameClient', ClientName)[1])]">
                <ClientReference>
                    <ClientName>
                        <xsl:value-of select="key('sameClient', ClientName)[1]/ClientName"/>
                    </ClientName>
                    <ClientCountry>
                        <xsl:for-each select="key('sameClient', ClientName)">
                            <xsl:value-of select="ClientCountry"/>
                            <xsl:if test="position() != last()">
                                <xsl:text>,</xsl:text>
                            </xsl:if>
                        </xsl:for-each>
                    </ClientCountry>
                </ClientReference>
            </xsl:for-each>
        </ClientReferences>
</xsl:template>

См. Преобразование на https://xsltfiddle.liberty -development.net /bFDb2CX / 1

...