首页 文章

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

提问于
浏览
0

我正在尝试在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

那也行不通 .

FWIW,将变量传递给函数是有问题的,因为用于定义“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]节点 . 我不知道如何从XPath谓词中的当前上下文节点引用@sessionID的值来搜索XML树中完全不同的部分中的其他节点,所以我使用了一个udf来做到这一点 . 它工作正常,直到我决定尝试使用变量作为字符串而不是让处理器每次都查找它 .

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

所以我的问题是:

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

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

1 回答

  • 0

    所以我的问题是:A . 对于用户定义的函数,如何设置依赖于XPath表达式的变量? B.在Xpath中是否有一种时髦的方法来使用从您尝试测试的Xpath表达式的谓词中的当前内容节点中提取的值?

    这两个问题都不清楚 .

    答:我认为你的意思是:

    “在xsl:函数内部,如何定义依赖于上下文节点的变量?”

    The answer :你不能 . 根据定义, xsl:function 中没有上下文节点 . 这由 W3C XSLT 2.0 specification 以下列方式定义:

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

    但是,您可以将预期的上下文节点(或只是必须用作当前的文档节点)作为参数传递 . 或者,您也可以参考全局定义的变量 .

    B:这个问题完全不可理解:

    • 什么是“时髦”?

    • 什么是“当前内容节点”?请提供一个以想要的“时髦”方式完成的特定任务的示例 .

相关问题