これはプレーンなXSLT1.0では非常に簡単です。必要なのは次のような再帰関数だけです。
<xsl:template name="UnrollString">
<xsl:param name="string" select="''" />
<xsl:param name="head" select="'/'" />
<xsl:variable name="tail" select="
concat(
substring-after($string, $head),
'/'
)
" />
<xsl:variable name="lead" select="
concat(
$head,
substring-before($tail, '/')
)
" />
<xsl:if test="not($tail = '/')">
<token>
<xsl:value-of select="$lead" />
</token>
<xsl:call-template name="UnrollString">
<xsl:with-param name="string" select="$string" />
<xsl:with-param name="head" select="concat($lead, '/')" />
</xsl:call-template>
</xsl:if>
</xsl:template>
の出力'/Geography/NA/US/California'
は次のとおりです。
<token>/Geography</token>
<token>/Geography/NA</token>
<token>/Geography/NA/US</token>
<token>/Geography/NA/US/California</token>
ご了承ください:
- この関数は、文字列が区切り文字(つまり、スラッシュ)で始まることを想定しています。そうでない場合、最初の単語('Geography')が出力に含まれません。
- 末尾のスラッシュは1つ無視されます。
- デリミタコールドは簡単に一般化され、パラメータとして渡されます。
<token>
再帰呼び出しを外部ではなく要素に配置することで、階層を簡単に構築できます。
<token>
要素の下ではなく上に再帰呼び出しを配置することで、出力の順序を逆にすることができます(最長から最短) 。
node-set()
返されたトークンをさらに使用できるものに変換するには、拡張関数を使用する必要があります。