2

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

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

这包含以下行:

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

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


我尝试了以下方法:

<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)]">
4

3 回答 3

4

它看起来很像 w3schools 正在使用的 libxslt 版本中的一个错误。

于 2012-09-05T13:26:49.013 回答
3

即使在引号内,您也必须输入<as&lt;这样它就不会与元素标记的开头混淆。我认为这样做是为了让容错解析器更容易从错误中恢复,并且流解析器可以更快地跳过内容。他们总是可以在<外面寻找CDATA并知道这是一个元素的开始或结束标记。

于 2012-09-05T11:40:14.963 回答
2

我不知道为什么,但是反转条件是可行的,所以不要寻找小于 5,而是寻找不超过 4

<xsl:for-each select="catalog/cd[not(position()>4)]">
于 2012-09-05T11:34:31.583 回答