我是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)]">
答案 0 :(得分:4)
它看起来非常像w3schools正在使用的libxslt版本中的错误。
答案 1 :(得分:3)
即使在引号内,您也必须将<
键入<
,这样才不会混淆元素标记的开头。我认为这样做是为了让容忍解析器更容易从错误中恢复,流解析器更快地跳过内容。他们总是可以在<
之外查找CDATA
,并知道这是元素的开头或结尾标记。
答案 2 :(得分:2)
我不知道为什么,但反转条件有效,所以不要寻找少于5,寻找不超过4
<xsl:for-each select="catalog/cd[not(position()>4)]">