9

如何在不使用 foreach 的情况下使用 xslt,X 位置的节点值

<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

4 回答 4

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]"/>
于 2011-09-17T15:06:13.223 回答
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作为顶部元素的所有子元素的第二个子元素的所有元素,其名称以字符串开头"item"

请注意以下表达式

(items/*/title)[2]

或者

(items//title)[2]

通常是不正确的,因为如果在 XML 文档中还有其他元素,例如 (say)"chapter"title子元素,则上述表达式可以选择一个chapter/title元素——但这里的任务是选择title文档中的第二个元素,其父元素只能是一个itemXYZ元素。

于 2011-09-17T16:58:58.623 回答
2

您可以使用位置()

<xsl:value-of select="/items/*[position()=2]/text()"/>
于 2011-09-17T14:58:57.133 回答
2

你可以用

<xsl:value-of select="items/child[position()=2]"/>
于 2011-09-17T14:59:07.053 回答