カジュアルな訪問者が来て、この問題のXSLT 1.0ソリューションがあるかどうか疑問に思った場合に備えて、次のことを提供します。私はショーンとマーティンの正解を減らそうとしているのではないことに注意してください。私は単にいくつかの味を提供しています。
このXSLT1.0ソリューションの場合:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key
name="kFollowing"
match="hi"
use="concat(@rend, '+', generate-id(following-sibling::text()[1]))" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<p>
<xsl:apply-templates
select="
hi[generate-id() =
generate-id(
key('kFollowing',
concat(@rend, '+', generate-id(following-sibling::text()[1])))[1])]" />
</p>
</xsl:template>
<xsl:template match="hi">
<xsl:copy>
<xsl:apply-templates
select="@*|key('kFollowing',
concat(@rend, '+', generate-id(following-sibling::text()[1])))/text()" />
</xsl:copy>
<xsl:apply-templates select="following-sibling::text()[1]" />
</xsl:template>
</xsl:stylesheet>
... OPの元のXMLに適用されます:
<p>
<hi rend="bold">aa</hi>
<hi rend="bold">bb</hi>
<hi rend="bold">cc</hi>
Perhaps some text.
<hi rend="italic">dd</hi>
<hi rend="italic">ee</hi>
Some more text.
<hi rend="italic">ff</hi>
<hi rend="italic">gg</hi>
Foo.
</p>
...目的の結果が生成されます:
<p>
<hi rend="bold">aabbcc</hi>
Perhaps some text.
<hi rend="italic">ddee</hi>
Perhaps some text.
<hi rend="italic">ffgg</hi>
Foo.
</p>