必要な処理を実装する完全で単純な変換を次に示します。
<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:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[@length]">
<xsl:variable name="vFollowingText" select=
"normalize-space(following-sibling::text()[1])"/>
<xsl:copy>
<xsl:apply-templates select="@*[not(name()='length')]"/>
<xsl:value-of select="substring($vFollowingText, 1, @length)"/>
<xsl:apply-templates/>
</xsl:copy>
<xsl:value-of select="substring($vFollowingText, @length+1)"/>
</xsl:template>
<xsl:template match="text()[preceding-sibling::*[1][@length]]"/>
</xsl:stylesheet>
この変換が提供された XML ドキュメントに適用されると、次のようになります。
<comment>
<opinion id="tag_1" length="93"/>
Un bon traiteur Findi Traiteur propose un choix de
<topicInstance id="tag_2" length="13"/>
pâtes cuites à la minute et d'
<topicInstance id="tag_3" length="9"/>
antipasti.
</comment>
必要な正しい結果が生成されます。
<comment>
<opinion id="tag_1">Un bon traiteur Findi Traiteur propose un choix de</opinion><topicInstance id="tag_2">pâtes cuites </topicInstance>à la minute et d'<topicInstance id="tag_3">antipasti</topicInstance>.</comment>
更新:
<opinion>
残りのコンテンツを囲む必要がある @enguerran のコメントに続いて、これを行う変換を次に示します。
<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:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[@length]" mode="following">
<xsl:variable name="vFollowingText" select=
"normalize-space(following-sibling::text()[1])"/>
<xsl:copy>
<xsl:apply-templates select="@*[not(name()='length')]"/>
<xsl:value-of select="substring($vFollowingText, 1, @length)"/>
<xsl:apply-templates/>
</xsl:copy>
<xsl:value-of select="substring($vFollowingText, @length+1)"/>
</xsl:template>
<xsl:template match="*[@length and not(preceding-sibling::*/@length)]">
<xsl:copy>
<xsl:apply-templates select="@*[not(name()='length')]"/>
<xsl:apply-templates select="node()"/>
<xsl:apply-templates mode="following" select=
"following-sibling::text()[1] |following-sibling::*" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[preceding-sibling::*[1][@length]] | text()"/>
</xsl:stylesheet>
この変換が提供された XML ドキュメント (上記) に適用されると、必要な正しい結果が生成されます。
<comment>
<opinion id="tag_1">
Un bon traiteur Findi Traiteur propose un choix de
<topicInstance id="tag_2">pâtes cuites </topicInstance>à la minute et d'<topicInstance id="tag_3">antipasti</topicInstance>.</opinion>
</comment>