使用xslt获取X位置的节点值

时间:2011-09-17 14:47:41

标签: xslt xpath xslt-1.0 msxsl

如何在不使用foreach

的情况下在x位置使用xslt节点值
<items>
<item1>x</item1>
<item2>x</item2>
<item3>x</item3>
</items>

这在编程意义上有所解释:

<xsl:value-of select="Items/Item[2]"/>

=============================================== ===

在以下xml:

中只是为了解决一些问题
<items>
    <about>xyz</about>
    <item1>
       <title>t1</title>
       <body>b1</body>
    </item1>
    <item2>
       <title>t2</title>
       <body>b2</body>
    </item2>
    <item3>
       <title>3</title>
       <body>3</body>
   </item3>
</items>

如何选择第二个项目标题。

4 个答案:

答案 0 :(得分:17)

回答扩展问题。如果选择所需元素的节点集,则可以使用位置值:

<xsl:value-of select="(items//title)[2]"/>

或:

<xsl:value-of select="(items/*/title)[2]"/>

请注意在按位置选择之前返回所需节点集所需的括号的用法。


你可以使用你所谓的“编程意义”。但是,由于子元素的未知名称,您需要*

<xsl:value-of select="items/*[2]"/>

请注意,XSLT 中的节点集不是从零开始。在上面的方法中,您选择的是第二个,而不是第三个

当您想要将当前位置与数字进行比较时,您确实需要position(),如下所示:

<xsl:value-of select="items/*[position()>2]"/>

选择位置大于2的所有position()不可缺少的其他情况是位置值是字符串类型的变量时:

<xsl:variable name="pos" select="'2'"/>
<xsl:value-of select="items/*[position()=$pos]"/>

答案 1 :(得分:4)

  

在以下xml:

中只是为了解决一些问题
<items> 
    <about>xyz</about> 
    <item1> 
       <title>t1</title> 
       <body>b1</body> 
    </item1> 
    <item2> 
       <title>t2</title> 
       <body>b2</body> 
    </item2> 
    <item3> 
       <title>3</title> 
       <body>3</body> 
   </item3> 
</items>
     

如何选择第二个项目标题

使用

/*/*[starts-with(name(), 'item')][2]/title

选择:所有title个元素,它们是top元素的所有子元素的第二个子元素,其元素的名称以字符串"item"开头。< / p>

请注意

等表达式
(items/*/title)[2]

(items//title)[2]

一般不正确,因为如果在XML文档中还有其他元素,例如(例如)"chapter"title子元素,则上述表达式可以选择chapter/title元素 - ,但此处的任务是选择文档中的第二个title,其父级只能是item XYZ 元素。

答案 2 :(得分:2)

您可以使用position()

<xsl:value-of select="/items/*[position()=2]/text()"/>

答案 3 :(得分:2)

你可以用

来做
<xsl:value-of select="items/child[position()=2]"/>