我正在尝试在XSLT中使用用户定义的函数,该函数重复调用某个字符串的值 . 该字符串基于XPath表达式的结果,该表达式在单个函数调用的范围内不会更改 . 我认为将它分配给变量而不是一遍又一遍地查找是一个好主意 .
不幸的是,至少在Saxon的实现中,你不能使用需要一个函数内部的节点的XPath表达式,即使是一个基于绝对路径的节点,而不是先使用抛弃线让函数知道你正在讨论根文档而不是另一个 .
因此,例如,以下代码引发错误:
通常,解决方案只是首先调用任何全局变量来提供上下文 . 例如,以下在udf内部工作($ root是用根节点标识的变量):
但是当尝试使用Xpath来修复变量的值时,这不起作用,因为我不允许将表达式放在for-each中 .
我也试过用
那也行不通 .
FWIW,将变量传递给函数是有问题的,因为用于定义“myleaf”的Xpath表达式取决于上下文节点,并且我不知道如何使Xpath基于当前上下文节点中的值调用一个路径 .
例如,在调用此函数的代码中,我有类似的东西:
我正在/ potato / stem [eye]节点的上下文中工作,并使用udf查找具有相同@sessionID值的/ potato / stem [scc]节点 . 我不知道如何从XPath谓词中的当前上下文节点引用@sessionID的值来搜索XML树中完全不同的部分中的其他节点,所以我使用了一个udf来做到这一点 . 它工作正常,直到我决定尝试使用变量作为字符串而不是让处理器每次都查找它 .
我试图避免更深层次(让我的函数本身调用一个命名模板或将一个命名模板放在我的原始for-each中并让该命名模板调用一个函数) .
所以我的问题是:
A.对于用户定义的函数,如何设置依赖于XPath表达式的变量?
B.在Xpath中是否有一种时髦的方法来使用从您尝试测试的Xpath表达式的谓词中的当前内容节点中提取的值?