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>

1 つのメモ: HTML タグを無視したくありません。画像があれば載せたいと思います。

ここで回答された同様の質問がいくつか見つかりましたが、どれもうまくいかなかったようです。あなたが提供できるかもしれないどんな助けにも感謝します!

4

1 に答える 1

0

問題の根本は、エスケープされた HTML (構造化されたマークアップではない) を取得し、それを構造化されたマークアップ (エスケープされていない HTML) として出力しようとしているようです。

Disable-output-escaping は、堅牢な方法ではなく、これを行うための簡単で汚い方法です。ツリー構造ではなく、文字列を操作しています。

これを適切に行うには、description 要素からエスケープされた HTML を実際に解析して、ツリー構造にする必要があります。次に、@ Dimitreが指摘したソリューションを使用できます。

でエスケープされた HTML を解析する方法は<description>? 文字列を解析するためにたくさんの派手な XSLT を書くことができます...それは頭痛の種ですが、実行可能です。または、Saxon を使用できる場合は、saxon:parse() 拡張関数を使用できます。saxon:parse() は文字列が整形式の XML であることを想定しているため、最初に要素の開始/終了タグを文字列にラップする必要がある場合があります。例えば

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