如何在保留HTML标记的同时在XSL中修剪XML提要



我有一个新闻故事的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标记。如果有一个图像,我想包括它。

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

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

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

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

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

saxon:parse(concat('<p>', description, '</p>'))

最新更新