这在普通的 XSLT 1.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')。
- 单个尾部斜杠被忽略。
- 定界符冷很容易泛化并作为参数传入。
<token>
您可以通过将递归调用放入元素而不是外部来轻松构建层次结构。
<token>
通过将递归调用放在元素上方而不是下方,可以反转输出顺序(从最长到最短) 。
- 您需要使用
node-set()
扩展函数将返回的令牌转换为可以进一步使用的东西。