2012-08-02 2 views
0

나는 RSS 뉴스 피드를 가지고있다. 헤드 라인과 스토리의 처음 350자를 전체 스토리에 대한 링크와 함께 표시하고 싶습니다. 그러나 350 번째 문자가 HTML 태그의 중간에있는 경우 (예 : <img ... 또는 <h2>) 출력 HTML이 끊어지고 링크가 작동하지 않습니다. 여기 내 XSLHTML 태그를 보존하면서 XML 피드를 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 태그를 무시하고 싶지 않습니다. 이미지가 있으면 그 이미지를 포함시키고 싶습니다.

나는 비슷한 질문을 여기에서 찾았지만 그 중 아무 것도 나를 위해 일하지 않은 것 같습니다. 어떤 도움을 주셔서 감사합니다.

+0

중복 가능성 http://stackoverflow.com/questions/10585133/trim-mixed-content-to-max-number-of-characters- 와 - XSLT) –

+0

나는 BBC 뉴스에서 피드에 XSL을 시도 (http://feeds.bbci.co.uk/news/video_and_audio/news_front_page/rss.xml?edition=uk) 그것은 잘 작동 , 나는 생각한다. 귀하의 링크에 이미 물음표가 포함되어있을 수 있습니다. 그러면 물음표를 앰퍼샌드에 추가해야합니다. –

+0

Yves B, 350 번째 문자가 HTML 태그의 중간에있는 경우에만 거의 발생하지 않습니다. Dimitre Novatchev, 저것 좀 봐야 겠어, 고마워. – dwarbi

답변

0

문제의 근본 원인은 이스케이프 처리 된 HTML (구조화 된 태그가 아님)을 구조화 된 마크 업 (이스케이프 처리되지 않은 HTML)으로 출력하려고하는 것입니다.

Disable-output-escaping은 문자열을 조작하려고하자마자 (예 : 트리밍) 왜냐하면 당신은 나무 구조에서 작동하지 않기 때문에, 당신은 문자열로 작동합니다.

올바르게 처리하려면 설명 요소에서 이스케이프 처리 된 HTML을 실제로 구문 분석해야 트리 구조를 유지해야합니다. 그런 다음 @ Dimitre가 가리키는 솔루션을 사용할 수 있습니다.

<description>에서 이스케이프 처리 된 HTML을 구문 분석하는 방법은 무엇입니까? 문자열을 파싱하기 위해 멋진 XSLT를 작성할 수 있습니다. 두통이지만 실행 가능합니다. 또는 Saxon을 사용할 수있는 경우 saxon:parse() extension function을 사용할 수 있습니다. saxon : parse()는 문자열이 올바른 형식의 XML이되기를 기대하기 때문에 먼저 요소 시작/끝 태그를 문자열 주위에 감쌀 수도 있습니다. 예 :

saxon:parse(concat('<p>', description, '</p>')) 
([XSLT와 최대 문자 수에 혼합 콘텐츠를 트리밍]의
관련 문제