'Merge 'p' element content under the following 'p element' content

It is list content, right now bullet list and item content appearing separately in the output. So I want to merge a <p>, Please look expected output and help me on that. Thanks in advance

Input xml:

<kk>
    <group class="li">
        <line>
            <t style="li">•</t>
        </line>
    </group>
    <group class="p">
        <line>
            <t style="p">content here</t>
        </line>
        <line>
            <t style="p">content here1</t>
        </line>
        <line>
            <t style="p">content here2</t>
        </line>
    </group>    
</kk>

Current Output:

<kk>
    <group class="li">
        <line>
            <t style="li">• content here content here1 content here2</t>
        </line>
    </group>
</kk>

Current XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="p">
        <p>
            <xsl:apply-templates/>
        </p>
    </xsl:template>
    
</xsl:stylesheet>

Expected output:

<kk>
<p>• content here</p>
</kk>


Solution 1:[1]

Here is an example using for-each-group group-starting-with to merge any "group" of elements starting with that bullet:

  <xsl:template match="kk">
    <xsl:copy>
      <xsl:for-each-group select="group" group-starting-with="group[@class = 'li' and ki/p[@class = 'li'] = '•']">
        <p>
          <xsl:value-of select="current-group()//p"/>
        </p>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

Solution 2:[2]

If you need to place all nested p elements following code should help:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:strip-space elements="kk group line"/>

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="kk">
    <xsl:copy>
        <p>
            <xsl:apply-templates/>
        </p>
    </xsl:copy>
</xsl:template>

<xsl:template match="group">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="line">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="t">
    <xsl:value-of select="concat(., ' ')"/>
</xsl:template>
</xsl:stylesheet>

My local output with provided Input xml:

<kk>
  <p>• content here content here1 content here2 </p>
</kk>

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Martin Honnen
Solution 2 Dharman