この状況で最も簡単なのは、スペース区切り文字で分割することです。XSLT 1.0 に制限されている場合、これを行う最も簡単な方法は、EXSLT ライブラリを使用することです (これは、PHP などの多くの XSLT 実装でデフォルトで利用可能です)。
この XMLPlaygroundで以下を実行できます(出力ソースを参照)。
<!-- root -->
<xsl:template match='/'>
<example>
<xsl:apply-templates select='*' />
</example>
</xsl:template>
<!-- match sample nodes -->
<xsl:template match="example/*">
<xsl:apply-templates select='str:split(., " ")' />
</xsl:template>
<!-- match token nodes (from EXSLT split()) -->
<xsl:template match='token'>
<text><xsl:value-of select='.' /></text>
</xsl:template>
Playground に示されているように、EXSLT を使用するには (利用可能な場合)、開始xsl:stylesheet
タグでその名前空間を宣言する必要があります。たとえば、その文字列ライブラリを使用するには (ここでは を利用するためにsplit()
)、次のように入力します。
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str"
[編集] -部分文字列アプローチを主張する場合、これは可能ですが、ノードセットを生成する機能がなく(EXSLTがsplit()
行うことです)、そのノードセットにテンプレートを適用することができないため、より長くなります。あなたがバッグに持っているトリックは再帰です - 1 つのテンプレートがその中のスペースの機能と同じ回数自分自身を呼び出します。
これは、この (別の) XMLPlaygroundで実行できます。
<!-- root child nodes -->
<xsl:template match='example/*'>
<xsl:call-template name='output'>
<xsl:with-param name='source' select='.' />
</xsl:call-template>
</xsl:template>
<!-- output - expects two params: -->
<!-- @output_str - the sub-string to output to a <text> node this time (has value only on self-call, i.e. recursion -->
<!-- @source - the source string on which to recurse, for more spaces in the string -->
<xsl:template name='output'>
<xsl:param name='output_str' />
<xsl:param name='source' />
<!-- output something this time? -->
<xsl:if test='$output_str'>
<text><xsl:value-of select='$output_str' /></text>
</xsl:if>
<!-- recurse... -->
<xsl:if test='$source'>
<xsl:choose>
<!-- $source contains spaces - act on the string before the next space -->
<xsl:when test='contains($source, " ")'>
<xsl:call-template name='output'>
<xsl:with-param name='output_str' select='substring-before($source, " ")' />
<xsl:with-param name='source' select='substring-after($source, " ")' />
</xsl:call-template>
</xsl:when>
<!-- source doesn't contain spaces - act on it in its entirety -->
<xsl:otherwise>
<xsl:call-template name='output'>
<xsl:with-param name='output_str' select='$source' />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>