Вот эффективное и правильное решение :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="knextStrings"
match="string[not(@isNewLine)]"
use="generate-id(preceding-sibling::string
[@isNewLine][1]
)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="string[@isNewLine]">
<line>
<xsl:copy-of select="@*[not(name()='isNewLine')]"/>
<xsl:copy-of select="text()
|
key('knextStrings',
generate-id()
)
/text()"/>
</line>
</xsl:template>
<xsl:template match="string[not(@isNewLine)]"/>
</xsl:stylesheet>
, когда это преобразование применяется к первоначально предоставленному документу XML :
<item>
<string isNewLine="1" lineNumber="32">some text in new line</string>
<string>, more text</string>
<item>
<string isNewLine="1" lineNumber="33">some text in new line</string>
<string isNewLine="1" lineNumber="34">some text</string>
<string> in the same line</string>
<string isNewLine="1" lineNumber="35">some text in new line</string>
</item>
</item>
желаемый, правильный результат получается :
<item>
<line lineNumber="32">some text in new line, more text</line>
<item>
<line lineNumber="33">some text in new line</line>
<line lineNumber="34">some text in the same line</line>
<line lineNumber="35">some text in new line</line>
</item>
</item>