【问题标题】:How to get only the 10 first entry tags using XSLT?如何使用 XSLT 仅获取 10 个第一个条目标记?
【发布时间】:2011-11-30 00:42:05
【问题描述】:

在我使用的 feedburner RSS 中

<xsl:template match="node() | @*">
  <xsl:copy>
    <xsl:apply-templates select="node() | @*" />
  </xsl:copy>
</xsl:template>

获取具有如下结构的提要的所有内容:

<feed>
<entry><published></published><title></title><content></content>....</entry>
</feed>

我的问题是,是否有可能只获得前 10 个 &lt;entry&gt;&lt;/entry&gt; 而不是全部 25 个?怎么办?

注意:入口标签有这种形式&lt;entry gd:etag="W/&amp;quot;AkcHRH8yfSp7ImA9WhdUFkg.&amp;quot;"&gt;我不知道这是否重要

【问题讨论】:

    标签: xslt stylesheet


    【解决方案1】:

    喜欢

    /feed/entry[position()<10]
    

    我的意思是,你需要添加这个模板:

    <xsl:template match="entry[position() &gt; 10]"/>
    

    这会删除 10 后的所有条目,或者相等的东西。主要建议是看看position()函数。

    【讨论】:

    • +1。请注意,这是一个 XPath 选择器,而不是 XSLT 本身。
    • 入口标签有这种形式&lt;entry gd:etag="W/&amp;quot;AkcHRH8yfSp7ImA9WhdUFkg.&amp;quot;"&gt;我不知道这是否重要
    • 你是说&amp;lt;吗?这会选择除了前 10 个条目之外的所有内容。
    • @Eric: 不,我的意思是 &amp;gt; (&gt;),所以我的模板 DROP(!!!) 所有带有 position() &gt; 10 的条目。所有带有position() &lt; 10(需要显示作者)的条目将默认处理并显示&lt;xsl:template match="node() | @*"&gt;模板。
    • @seriyPS:啊,我明白了。这是一种非常奇怪的写法。
    【解决方案2】:

    您的模板是递归的。然后,您更改了外部模板的行为,中断了递归。

    做你想做的最简单的方法是:

    <xsl:template match="/feed/entry[position() &lt; 10]">
        <xsl:copy-of select="." />
    </xsl:template>
    

    【讨论】:

    • 这不能正常工作,因为 /feed/entry[position() &amp;lt; 3] 匹配前 3 个帖子,但 node() | @* 匹配 3'd 之后的其余内容
    • @seriyPS:不确定你的意思。我的代码不包含node() | @*
    • 是的,您的代码没有,但生成的代码将包含至少 2 个模板,一个是您的,一个是 &lt;xsl:template match="node() | @*"&gt;,来自我认为的问题。因此,您的模板匹配前 10 个条目,但所有其他条目将由 2-nd 模板成功处理。
    • @reiyPS:不会。因为我使用的是copy-of,所以我不需要&lt;xsl:template match="node() | @*"&gt;
    猜你喜欢
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2019-12-28
    相关资源
    最近更新 更多