0

我有新闻报道的 RSS 提要。我想显示标题和故事的前 350 个字符,并带有指向完整故事的链接。但是,如果第 350 个字符位于 HTML 标记的中间(即<img ...,甚至<h2>),我的输出 HTML 会中断并且链接将不起作用。这是我的 XSL

<xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:template match="/">
<div>
<xsl:for-each select="//rss/channel/item">
<h2><xsl:value-of select="title" disable-output-escaping="yes"/></h2><br />
<xsl:value-of select="substring(description, 1, 350)" disable-output-escaping="yes"/><xsl:text>...</xsl:text>
<a><xsl:attribute name="href"><xsl:value-of select="link" disable-output-escaping="yes"/>
<xsl:text disable-output-escaping="yes">?tmpl=component&amp;print=1</xsl:text>
</xsl:attribute>Read more</a>
<br />
<xsl:value-of select="substring(pubDate,1,16)"/><br />
<br/>
<br/>
</xsl:for-each>
</div>
</xsl:template>

注意:我不想忽略 HTML 标签。如果有图片,我想包括它。

我在这里找到了一些类似的问题的答案,但似乎没有一个对我有用。非常感谢您提供的任何帮助!

4

1 回答 1

0

问题的根源似乎是您试图采用转义的 HTML(不是结构化标记)并将其输出为结构化标记(未转义的 HTML)。

禁用输出转义是一种快速而肮脏的方法,而不是一种健壮的方法,正如您所看到的:一旦您尝试对字符串进行操作(例如修剪),您就会失去格式良好,因为您'不是在树结构上操作,而是在字符串上操作。

要正确执行此操作,您需要实际解析描述元素中的转义 HTML,以便将其作为树结构。然后你可以使用@Dimitre 指出的解决方案。

如何解析中的转义 HTML <description>?您可以编写一堆花哨的 XSLT 来解析字符串……这会让人头疼,但可行。或者,如果您有可用的 Saxon,则可以使用saxon:parse() 扩展函数。您可能必须首先将元素开始/结束标签包装在字符串周围,因为 saxon:parse() 期望字符串是格式良好的 XML。例如

saxon:parse(concat('<p>', description, '</p>'))
于 2012-08-02T19:39:57.347 回答