我有一些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&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标记。如果有图像,我想包含它。
我在这里找到了一些类似的问题,但它们似乎都没有对我有用。非常感谢您提供的任何帮助!
答案 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>'))