テキストノードを操作する必要があるため、「substring-before」を使用して文字列を分割します。この例は機能します:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="VALUE">
<xsl:call-template name="replace">
<xsl:with-param name="txt">
<xsl:value-of select="."/>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="replace">
<xsl:param name="txt"/>
<xsl:if test="not(contains($txt,'||'))">
<xsl:value-of select="$txt"/>
</xsl:if>
<xsl:if test="contains($txt,'||')">
<xsl:value-of select="substring-before($txt,'||')"/>
<hr/>
<xsl:call-template name="replace">
<xsl:with-param name="txt">
<xsl:value-of select="substring-after($txt,'||')"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
整形式のxmlを構築しませんが、アイデアを提供します。<hr/> を使用して新しい行を表示しました。必要に応じて適切なコードをここに挿入します。
何が起こっている?XSLT スクリプトは、分割するテキストを含む要素に到達すると、名前付きテンプレートを呼び出し、テキストをパラメーターとして送信します。
名前付きテンプレートは、パラメーターに分割マーカーが含まれているかどうかを確認します。そうでない場合、テキストはそのまま使用されます。存在する場合、分割マーカーの前のテキストが使用され、後のテキストが名前付きテンプレートに再度 (再帰的に) 与えられます。