There is probably an easy way to do this using XSLT2.0, but I assumed XSLT1.0 here.
One thing is not that your XML is not strictly true because it lacks a root element. For the purpose of the answer, I suggested that the root element is called elements
, , "" . , @lp. XSLT1.0 ,
<xsl:variable name="level" select="string-length(@lp) - string-length(translate(@lp, '.', ''))" />
, , ...
<xsl:apply-templates
select="element[string-length(@lp) - string-length(translate(@lp, '.', '')) = 0]"/>
<element lp="1."/>
<element lp="2."/>
<element lp="3."/>
, ,
<xsl:apply-templates
select="following-sibling::element[substring(@lp, 1, $len) = $lp][string-length(@lp) - string-length(translate(@lp, '.', '')) = $level + 1]"/>
(. $len $level - , @lp )
, XSLT....
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/elements">
<elements>
<xsl:apply-templates select="element[string-length(@lp) - string-length(translate(@lp, '.', '')) = 0]"/>
</elements>
</xsl:template>
<xsl:template match="element">
<xsl:variable name="lp" select="@lp"/>
<xsl:variable name="len" select="string-length(@lp)"/>
<xsl:variable name="level" select="$len - string-length(translate(@lp, '.', ''))" />
<xsl:copy>
<xsl:copy-of select="@lp"/>
<xsl:apply-templates select="following-sibling::element[substring(@lp, 1, $len) = $lp][string-length(@lp) - string-length(translate(@lp, '.', '')) = $level + 1]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XML
<elements>
<element lp="1"/>
<element lp="1.1"/>
<element lp="2"/>
<element lp="3"/>
<element lp="3.1"/>
<element lp="3.2"/>
<element lp="3.2.1"/>
</elements>
<elements>
<element lp="1">
<element lp="1.1"/>
</element>
<element lp="2"/>
<element lp="3">
<element lp="3.1"/>
<element lp="3.2">
<element lp="3.2.1"/>
</element>
</element>
</elements>