0

我们有一个具有层次组结构的应用程序。一些组以这种格式传递:

/Geography/NA/US/California

我想“展开”这个字符串,以便我可以得到一个节点集,如下所示:

/Geography
/Geography/NA
/Geography/NA/US
/Geography/NA/US/California

我知道我可以使用str:tokenize并获得这样的节点集:[Geography, NA, US, California]但我不知道如何逐步将这些部件重新组装在一起。

我可以使用大部分exslt函数,但没有 XSLT 2.0 函数。

任何帮助表示赞赏!

4

2 回答 2

2

这在普通的 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()扩展函数将返回的令牌转换为可以进一步使用的东西。
于 2009-08-04T09:19:04.093 回答
0

标记它,然后编写一个递归模板,仅将您感兴趣的部分连接在一起。(我现在不打算坐下来写这个,但我会使用 XPath 和set:leading的组合来生成首先是完整节点集,然后是除最后一个节点之外的所有节点,然后是除最后两个节点之外的所有节点,依此类推——您将传递完整节点集和您最近剥离的任何节点作为每个节点的模板参数递归,直到到达节点集的开头。)

令人高兴的是,这是一个很好的简单的类似阶乘的递归,而不是像斐波那契数列那样可怕的东西。

于 2009-08-03T21:58:00.370 回答