无法理解XSLT代码

时间:2013-08-26 13:16:24

标签: xslt

我的XSLT中有一些类似下面的代码 -

<div>
<ul class="toplevel-Video group Video-coll-left">
<xsl:apply-templates select="//VideoNode[@Video='Yes'][1]" />
</ul>
<ul class="toplevel-Video group Video-coll">
<xsl:apply-templates select="//VideoNode[@Video='Yes'][position()>=2 and last()>position()]" />
</ul>
<ul class="toplevel-Video group Video-coll-right">
<xsl:apply-templates select="//VideoNode[@Video='Yes'][last()]" />
</ul>
</div>

并且无法理解下面代码中的[1]是什么意思

<xsl:apply-templates select="//VideoNode[@Video='Yes'][1]" />

谢谢

3 个答案:

答案 0 :(得分:2)

//X[1](//X)[1]之间存在差异。第一个表达式选择每个X作为其父项的第一个X子项;第二个选择文档中的第一个X.实际上,“[]”运算符的优先级高于“//”运算符。更正式地,//X[1]扩展为root()/(descendant-or-self::node())/(child::X[1]),而(//X)[1]扩展为(root()/descendant-or-self::node()/child::X)[1]

答案 1 :(得分:1)

它只是意味着集合中的第一个节点。因此,第一个ul包含第一个元素,中间ul包含除第一个和最后一个之外的所有节点,最后一个ul包含最后一个节点。

答案 2 :(得分:1)

select表达式是一个XPATH表达式,表示:

  • 从root或其他任何内容开始(//
  • 找到标签名称VideoNode
  • 但仅限属性Vidoe且值为Yes
  • 的属性
  • 返回第一个此类节点[1]

现在,[1]部分选择父节点的第一个匹配节点,因此如果您的VideoNode节点有多个父节点,那么结果应该是多个这样的节点......

e.g:

<root>
    <parent1>
        <VideoNode Video='Yes'/> <!-- this gets selected -->
        <VideoNode Video='Yes'/>
        <VideoNode Video='Yes'/>
        <VideoNode Video='Yes'/>
        <VideoNode Video='Yes'/>
    </parent1>
    <parent2>
        <VideoNode Video='Yes'/> <!-- and so does this! -->
        <VideoNode Video='Yes'/>
        <VideoNode Video='Yes'/>
    </parent2>
</root>

所以[1]本地,而非全球。