position()= 1正常工作,但不是位置()< 5

时间:2012-09-05 11:21:11

标签: xslt foreach

我是XSLT的新手,我正在使用w3schools“自己尝试”页面进行一些测试。我正在使用以下演示:

http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=tryxsl_choose

这包含以下行:

<xsl:for-each select="catalog/cd">

我正在测试过滤由position()呈现的HTML,但在使用<操作数时遇到问题。


我尝试了以下内容:

<xsl:for-each select="catalog/cd[position()=1]">

这将返回XML数据中的第一项(如预期的那样)。


然后我尝试了:

<xsl:for-each select="catalog/cd[position()<5]">

我期待这会返回前4项,但我没有得到任何结果。

我的猜测是position()=1可能正在进行字符串比较,这就是为什么它会返回第一项,但它无法理解position()<5因为字符串无法以这种方式进行比较?

为什么会发生这种情况,以及获得我希望实现的结果的正确语法是什么?


更新:在阅读@ joocer的回复并自行测试后,使用>操作数确实有效,但结果相反:

<xsl:for-each select="catalog/cd[(position()>5)]">

3 个答案:

答案 0 :(得分:4)

它看起来非常像w3schools正在使用的libxslt版本中的错误。

答案 1 :(得分:3)

即使在引号内,您也必须将<键入&lt;,这样才不会混淆元素标记的开头。我认为这样做是为了让容忍解析器更容易从错误中恢复,流解析器更快地跳过内容。他们总是可以在<之外查找CDATA,并知道这是元素的开头或结尾标记。

答案 2 :(得分:2)

我不知道为什么,但反转条件有效,所以不要寻找少于5,寻找不超过4

<xsl:for-each select="catalog/cd[not(position()>4)]">