如何在需要路径调用的udf中设置变量的值



我试图在XSLT中使用一个用户定义的函数,该函数反复调用某个字符串的值。该字符串基于XPath表达式的结果,该表达式在单个函数调用的范围内不会改变。我认为把它赋值给一个变量会是个好主意,而不是一遍又一遍地查找。

不幸的是,至少在Saxon的实现中,如果不首先使用一次性行让函数知道您正在讨论的是根文档而不是其他文档,就不能使用需要函数内部节点的XPath表达式,即使是基于绝对路径的节点。

例如,下面的代码会抛出一个错误:
<xsl:function name="udf:LeafMatch">
<xsl:param name="sID"></xsl:param>
<xsl:variable name="myLeaf" select="/potato/stem[@sessionID=$sID][scc]/scc/@leafnumber"/>

通常,解决方案只是首先调用任何全局变量来给出上下文。例如,在udf ($root是一个由根节点标识的变量)中可以使用以下代码:

<xsl:for-each select="$root">
<xsl:value-of select="/potato/stem[@sessionID=$sID][scc]/scc/@leafnumber"/>
</xsl:for-each>

但是,当尝试使用Xpath来固定变量的值时,这不起作用,因为不允许将表达式放在for-each中。

我也试过使用

<xsl:choose><xsl:when select"$root"><xsl:value-of select="/potato/stem[@sessionID=$sID][scc]/scc/@leafnumber"/></xsl:when></xsl:choose>

给出上下文,就像我在这里看到的那样:http://www.stylusstudio.com/xsllist/200504/post00240.html

那也不行。

最后,将变量传递给函数是有问题的,因为用于定义"myleaf"的Xpath表达式依赖于上下文节点,而我不知道如何让Xpath根据当前上下文节点中的值调用一条路径。

例如,在调用这个函数的代码中,我有这样的代码:
<xsl:for-each select="/potato/stem[eye]">
<leaf = "{udf:LeafMatch(@sessionID)}"/>
</xsl:for-each>

我正在/potato/stem[eye]节点的上下文中工作,并使用udf来查找具有相同值的@sessionID的/potato/stem[scc]节点。我不知道如何在搜索XML树的完全不同部分的其他节点的XPath谓词中从当前上下文节点引用@sessionID的值,因此我使用udf来做到这一点。它工作得很好,直到我决定尝试为字符串使用一个变量,而不是让处理器每次都查找它。

我试图避免更深一层(让我的函数本身调用命名模板或将命名模板放入原始的for-each中并让命名模板调用函数)。

我的问题是:

。对于用户定义的函数,如何设置依赖于XPath表达式的变量?

B。在Xpath中是否有一种时髦的方法,可以在您要测试的Xpath表达式的谓词中使用从当前内容节点绘制的值?

我的问题是:

。对于用户定义的函数,如何设置依赖的变量关于XPath表达式?

B。在Xpath中是否有一种时髦的方法来使用从当前获取的值在正在尝试的Xpath表达式的谓词中添加内容节点测试?

两个问题都很不清楚。

A:我想你的意思是:

"在一个xsl:function中,我如何定义一个依赖于上下文节点?"

答案:你不能。根据定义,在xsl:function中没有上下文节点。这由W3C XSLT 2.0规范以以下方式定义:

"在样式表函数的主体中,焦点是初始的未定义的;这意味着任何引用上下文项的尝试,上下文位置或上下文大小是不可恢复的动态错误。[XPDY0002] "

但是,您可以将预期的上下文节点(或仅作为当前必须使用的文档节点)作为参数传递。或者,您也可以引用全局定义的变量。 这个问题完全不能理解。
  1. 什么是"时髦"?

  2. 什么是"当前内容节点"?

  3. 请提供一个具体任务的示例,以所需的"时髦"方式完成。

最新更新