xslt将变量值​​赋给字符串文字

时间:2011-11-24 05:26:42

标签: xslt

我有

<xsl:for-each select="ancestor-or-self::*">
  <xsl:variable name="expression" select="name()" ></xsl:variable>
</xsl:for-each>

下面我有href,我想在href中设置这个表达式变量的值#######

<a href="/myplan?expression={$expression}" class="deleteIcon">Delete</a>

我也尝试过:

  <a href="concat('/myplan?expression={',$expression)}" class="deleteIcon">Delete</a>

他们都没有工作。

任何人都可以帮我解决这个问题吗?

基本上我的任务是找到当前节点的表达式并在href中发送相同的表达式?

添加更多信息:

<br/><xsl:for-each select="ancestor-or-self::*">
               <xsl:variable name="expression" select="name()" />
            </xsl:for-each>
        <b><a href="{concat('/admin/eapp/deleteQuestions?expression=',$expression)}"></a>Click Me</b>

当上面的xsl代码被转换时,它给出了以下错误:

 Variable or parameter 'expression' is undefined.

2 个答案:

答案 0 :(得分:1)

在XSLT1.0中,您可以尝试设置变量:

  <xsl:variable name="expression">
     <xsl:for-each select="ancestor-or-self::*">
        <xsl:text>/</xsl:text>
        <xsl:variable name="name" select="name()"/>
        <xsl:value-of select="$name"/>
     </xsl:for-each>
  </xsl:variable>

因此,假设以下XML结构

<As>
   <a>
      <Bs>
         <b>5</b>
      </Bs>
   </a>
   <a>
      <Bs>
         <b>9</b>
      </Bs>
   </a>
   <a/>
   <a>
      <Bs>
         <b>12</b>
         <b>14</b>
         <b>15</b>
      </Bs>
   </a>
</As>

如果您位于 b 元素且值为14,则表达式将设置为 / As / a / Bs / b

但是,这并没有考虑具有相同名称的多个节点,因此如果您想要准确的XPath来选择节点,那就不够了。

相反,您可以尝试以下方法:

  <xsl:variable name="expression">
     <xsl:for-each select="ancestor-or-self::*">
        <xsl:text>/</xsl:text>
        <xsl:variable name="name" select="name()"/>
        <xsl:value-of select="$name"/>
        <xsl:text>[</xsl:text>
        <xsl:value-of select="count(preceding-sibling::*[name() = $name]) + 1"/>
        <xsl:text>]</xsl:text>
     </xsl:for-each>
  </xsl:variable>

这将返回 / As [1] / a [4] / Bs [1] / b [2] ,这可能是你想要的。

答案 1 :(得分:0)

很简单,变量在XSL中作用域,并且只存在于包含的标记内。因此,名为expression的变量仅存在于for-each块中。此外,变量只能设置一次。尝试再次设置变量值无效。

因此,您必须将变量声明为要使用它的级别或更高级别,并将所有代码放在变量声明中生成值。如果您可以使用XSLT2,以下将执行您想要的操作:

string-join(for $n in ancestor-or-self::* return name($n), '/')

我知道它也可以在带有递归模板的XSLT 1中完成,但我没有一个方便的例子。