xslt 匹配过滤结果集的前 x 项
对 xslt 很陌生,所以如果这是一个基本问题,请原谅我 - 我无法在 SO 上或通过 Google 搜索找到答案。
我想要做的是返回一组经过过滤的节点,然后对该组中的前 1 或 2 个项目进行模板匹配,然后另一个模板与其余项目匹配。但是,如果没有
循环,我似乎无法做到这一点(这是非常不可取的,因为我可能匹配 3000 个节点,但只以不同方式处理 1 个节点) 。
使用 position()
不起作用,因为它不受过滤的影响。我尝试过对结果集进行排序,但这似乎没有足够早地生效以影响模板匹配。
输出正确的数字,但我无法在匹配语句中使用这些数字。
我在下面放置了一些示例代码。我使用下面不合适的 position()
方法来说明问题。
提前致谢!
XML:
<?xml version="1.0" encoding="utf-8"?>
<news>
<newsItem id="1">
<title>Title 1</title>
</newsItem>
<newsItem id="2">
<title>Title 2</title>
</newsItem>
<newsItem id="3">
<title></title>
</newsItem>
<newsItem id="4">
<title></title>
</newsItem>
<newsItem id="5">
<title>Title 5</title>
</newsItem>
</news>
XSL:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<ol>
<xsl:apply-templates select="/news/newsItem [string(title)]" />
</ol>
</xsl:template>
<xsl:template match="newsItem [position() < 4]">
<li>
<xsl:value-of select="title"/>
</li>
</xsl:template>
<xsl:template match="*" />
</xsl:stylesheet>
所需结果:
- 标题 1
- 标题 2
- 标题 5
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这实际上比你想象的要简单。执行:
并从 选择中删除 [string(title)] 谓词。
像这样:
您在这里有效执行的是在
[string(title)]
过滤器之后应用第二个过滤器 ([position() < 4]
) ,这会导致将position()
应用于过滤后的列表。This one's actually simpler than you might think. Do:
And drop the [string(title)] predicate from your
<xsl:apply-templates
select.Like this:
What you're effectively doing here is applying a second filter (
[position() < 4]
) after your[string(title)]
filter, which results in theposition()
being applied to the filtered list.