代码之家  ›  专栏  ›  技术社区  ›  GSerg

XPath:从变量中的节点集查询属性

  •  1
  • GSerg  · 技术社区  · 16 年前

    $context .

    如何正确查询$context中最顶层节点的属性?显然,如果$context是当前节点,我只需编写 "@attname" ,但事实并非如此。目前我有 $context/../@attname 这对我来说不太好。

    编辑

    好的,数据。 Here is what I see in the VS .

    如果您想知道我是如何得到这个奇怪的东西的:我将一个节点与其子节点和从不同节点中选择的属性联合起来:

    <xsl:with-param name="context" select=". | ../@res" /> .

    我不完全清楚这会产生什么结果,但我可以看出它是有效的。突出显示的是我感兴趣的属性。

    如果这有意义的话,可能会创建一个不附加任何内容的属性:|

    3 回复  |  直到 16 年前
        1
  •  1
  •   Tomalak    16 年前
    $context/../@attname
    

    $context

    如果节点集包含类似的内容(单个节点)

    <node attname="foo">
      <bar />
    </node>
    

    然后:

    $context/@attname
    

    <node attname="foo">
      <bar />
    </node>
    <node attname="foo">
      <bar />
    </node>
    

    然后:

    $context[1]/@attname
    

    如果变量包含结果树片段(RTF),所有这些都不起作用。在这种情况下,您需要使用一个名为 node-set() . 大多数XSLT处理器都提供此功能。


    编辑:变量包含当前节点与其父节点的裸属性节点的并集:

    <xsl:with-param name="context" select=". | ../@res" />
    

    联合的结果将始终按文档顺序排列,因此即使您选择了该属性 之后 XPath中的上下文节点,它将出现在结果节点集中 -上下文节点的父节点在文档顺序中位于上下文节点之前。

    你需要 $context[1] 要获取属性节点,请执行以下操作: $context[2]

    我必须说,这是一些奇怪的,可能是不必要的复杂变量的使用。我相信有一种方法可以减轻痛苦。比如你可以做什么

     <xsl:with-param name="context" select="." />
    

    然后使用 $context/../@res

    也, 这个 <xsl:with-param> 你在这里的表演是一场比赛的一部分 <xsl:call-template> ,您可以完全删除该参数。当调用(而不是应用)模板时,上下文节点不会更改,传入它是多余的。

        2
  •  0
  •   Martijn Laarman    16 年前

    除了tomalak的答案之外,如果您确实需要传播回根目录,您可以尝试:

    ancestor::*[not(..)]

    不过,我很想知道你可能想要/需要这样的情况。

    您可以通过粘贴来尝试:

    //pet/ancestor::*[not(..)]

    Xpath test tool .

        3
  •  0
  •   Martin Honnen    16 年前

    像你一样 <xsl:with-param name="context" select=". | ../@res" /> “res”属性是名为“context”的变量绑定到的节点集(XPath 1.0)或序列(XPath 2.0)的一部分。使用XPath2.0,您可以使用 $context/self::attribute(res) 但是XPath1.0没有类似的表达式,所以您已经有了( $context[1] $context/../@res )在我看来,这就是你所能做的。