这篇 7 年前的帖子表明,可能有一个特定于 Xalan 的非 XSLT 解决方案可用,但实现独立性和 Michael 的回应将我推向了寻找基于 XSLT1 的有效解决方案的方向。
这里是; 我不确定它是否对其他人有用。我想知道是否有更简单的方法?
只要您正确设置了所有内容,您就可以依赖 XSLT。从规范:
在 XSLT 中,最外层的表达式(即不属于另一个表达式的表达式)按如下方式获取其上下文:
上下文节点来自当前节点
上下文位置来自当前节点在当前节点列表中的位置;第一个位置是 1
从最后开始,我得到将表达式 $expression 应用于变量 $result 的结果:
<xsl:variable name="result" >
<xsl:apply-templates select="$vNodeSet" mode="myeval">
<xsl:with-param name="expression" ><xsl:value-of select="$expression"/></xsl:with-param>
<xsl:with-param name="pos" ><xsl:value-of select="$pos"/></xsl:with-param>
</xsl:apply-templates>
</xsl:variable>
apply-templates 将合适的“当前节点列表”推送到以下模板:
<xsl:template match="*" mode="myeval">
<xsl:param name="expression">1. </xsl:param>
<xsl:param name="pos">3</xsl:param>
<xsl:choose>
<xsl:when test="position()=$pos">
<xsl:value-of select="dyn:evaluate($expression)" /></xsl:when>
<xsl:otherwise />
</xsl:choose>
</xsl:template>
此模板评估我想成为“当前节点”的节点的表达式。注意:
- dy:evaluate 的使用(感谢 Martin!)
- $pos 标识我想要的当前节点。
我能够使用Dimitre对较早问题的回答来计算 $pos;我还使用了他的变量名 vNodeSet
感谢 Dimitre、Martin 和 Michael!