【问题标题】:"Unrolling" a string with XSL使用 XSL “展开”字符串
【发布时间】:2009-08-03 21:36:26
【问题描述】:

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

/Geography/NA/US/California

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

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

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

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

任何帮助表示赞赏!

【问题讨论】:

    标签: xml xslt string exslt


    【解决方案1】:

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

    【讨论】:

    • 这太棒了!这正是我想要的。谢谢!如果您能告诉我如何在保留其余标记(例如“/Geography/NA”)的同时删除“/Geography”标记,则可以加分。
    • 您可以将token 包装成xsl:if test="contains(substring-after($lead, '/'), '/')"
    【解决方案2】:

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

    幸运的是,这是一个很好的简单的阶乘式递归,而不是像斐波那契数列那样可怕的东西。

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 2011-05-02
      相关资源
      最近更新 更多