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

时间:2012-08-02 10:22:44

标签: xml xslt xml-parsing

我有一些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标记。如果有图像,我想包含它。

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

1 个答案:

答案 0 :(得分:0)

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

禁用 - 输出 - 转义是一种快速而肮脏的方式来执行此操作,而不是一种强大的方式,如您所见:只要您尝试对字符串进行操作(例如修剪),就会失去格式良好因为你没有在树形结构上操作,所以你在字符串上操作。

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

如何解析<description>中的转义HTML?你可以编写一堆花哨的XSLT来解析字符串...这将是一件令人头疼的问题但是可行。或者,如果您有撒克逊人,则可以使用saxon:parse() extension function。您可能必须首先在元素周围包装元素开始/结束标记,因为saxon:parse()期望字符串是格式良好的XML。 E.g。

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