XSLT:使模板中的路径解析/相对于模板

时间:2012-04-03 17:44:13

标签: xslt

我有一个模板

<xsl:template name="template">
<xsl:param name="param"/>
</xsl:template>

我打电话使用

<xsl:call-template name="template">
<xsl:with-param name="param" select="."/>
</xsl:call-template>

这解决了内容。到一个字符串,并将它们传递给模板。

然而,它结算了。相对于模板调用。如果我更改模板中的上下文,如何在模板中相对于新上下文解析参数?


根据请求添加的示例:

<xsl:template name="template">
    <xsl:param name="param1"/>
    <xsl:param name="param2"/>
    <xsl:for-each select="$param1">
        <xsl:value-of select="func:Lookup($param2)"/>
    </xsl:for-each>
</xsl:template>

<xsl:call-template name="template">
    <xsl:with-param name="param1" select="element"/>
    <xsl:with-param name="param2" select="."/>
</xsl:call-template>

其中param1和param2是相对的xpath。

我想要做的是将两个相对xpath传递给模板,然后解决它们。 <xsl:for-each select="$param1">应解析为某些元素,然后.应相对于每个元素进行解析。应该相对于$ param1解析$ param2。

但实际发生的是两者都是相对于模板调用解决的。这对于param1是可以的,但对于param2则没有。

如果不是for-each,我可以将element/.作为param2传递。但这不会起作用因为每个人。

1 个答案:

答案 0 :(得分:0)

参数值实际上是一个节点(当前节点)而不是一个字符串,但你是正确的(就像在大多数语言中一样)该参数包含一个值而不是一个语法片段。如果你真的需要传递一个字符串(或者更常见的是,从源中提取的xpath片段),你需要一个动态的评估扩展,例如axon:evaluate,很多(但不是全部)产品都有这样的扩展。如果需求很简单,例如元素名称)而不是任意xpath,则可以传递一个字符串,例如

 <xsl:with-param name="paaram2" select="'foo'"/>

然后将其用作

<xsl:value-of select="func:Lookup(*[name()=$param2])"/>

将元素<foo/>传递给函数。

在这里,从里到外阅读表达

 *

选择当前节点的所有子元素

name()
然后

返回该元素的名称,以便

[name()=$param2]

仅适用于参数中指定了名称的子元素,因此

*[name()=$param2]

选择名称由参数和

指定的元素
func:Lookup(*[name()=$param2])

将扩展函数应用于这些元素。