我有
<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.
答案 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中完成,但我没有一个方便的例子。