如何使用xslt,节点值在X位置,而不使用foreach
<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>
如何选择第二个项目的标题
展开问题的答案。如果选择所需元素的节点集,则可以使用位置值:
<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 value是类型为string:
的变量时,position()
是不可缺少的。<xsl:variable name="pos" select="'2'"/>
<xsl:value-of select="items/*[position()=$pos]"/>
使用只是一个小小的扩展问题,在下面的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"
开头。
请注意,像:
这样的表达式(items/*/title)[2]
或
(items//title)[2]
通常是不正确的,因为如果在XML文档中有其他元素,例如(例如)"chapter"
有title
子元素,则上述表达式可以选择chapter/title
元素—,但这里的任务是选择文档中的第二个title
,其父元素只能是item
XYZ元素。
可以使用position()
<xsl:value-of select="/items/*[position()=2]/text()"/>
你可以用
<xsl:value-of select="items/child[position()=2]"/>