我有一个模板
<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传递。但这不会起作用因为每个人。
答案 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])
将扩展函数应用于这些元素。