假设您可以使用像 Saxon 9 或 XmlPrime 这样的 XSLT 2.0 处理器
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:template match="p">
<xsl:copy>
<xsl:for-each-group select="node() except text()[not(normalize-space())]"
group-adjacent="self::hi or self::lb[@break = 'no']">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<span class="{current-group()[self::hi][1]/@rend}">
<xsl:apply-templates select="current-group()/node()"/>
</span>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
改造
<p>
<lb n="28"/> Lorem ipsum dolor sit
<lb n="29"/> amet, consectetur, <hi rend="u">adi</hi>
<lb n="30" break="no"/><hi rend="u">pisci</hi> elit...
</p>
进入
<p> Lorem ipsum dolor sit
amet, consectetur, <span class="u">adipisci</span> elit...
</p>