代码之家  ›  专栏  ›  技术社区  ›  Marcus Rickert

如何确定XSLT select中的内部上下文节点

  •  1
  • Marcus Rickert  · 技术社区  · 15 年前

    我试图通过使用用户定义的函数cube来确定存储在变量obj中的节点子集:is_active:

        <xsl:variable name="active_cubes" select="$objs[cube:is_active(XXX) = 'TRUE']"/>
    

    由于函数不允许本地上下文,所以需要将其作为参数(由xxx表示)传递。但是,通常怀疑“.”或“current()”不起作用,因为它们引用了周围块的上下文节点,而不是被评估的obj的当前元素。

    目前唯一可行的解决方案是:

    XXX=SOME_CHILD_TAG/..
    

    但这确实很难看,因为父节点的正确工作依赖于子标记的存在。

    还有别的办法吗?谢谢!

    1 回复  |  直到 15 年前
        1
  •  0
  •   AxelEckenberger    15 年前

    你需要使用 node-set() 您的XSLT处理器支持的函数。

    即。

    <xsl:variable name="active_cubes" select="exsl:node-set($objs)[cube:is_active(XXX) = 'TRUE']"/>
    

    该示例假定您的处理器支持 exsl:node-set 函数。显然,您必须使用 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" .

    编辑:

    由current()或“.”描述的上下文位置应是中节点列表中的第n个项。 $objs ( see here )因此因此 $objs[cube:is_active(.) = 'TRUE'] 应该工作。

    检查常见错误:

    • $objs是否包含正确的节点,
    • 无论cube:是活动的返回字符串还是布尔值,
    • $obj中是否有多个节点,否则谓词就没有意义。相反,你可以尝试 xsl:if 构造时使用 test 属于 cube:is_active($objs) = 'TRUE'