我正在使用doctype:XHTML Mobile Profile 1.2,XML version =“1.0 and Content-Type”application / xhtml + xml“
是否可以禁用或阻止RSS Feed中出现<cite>
标记,因为我一直在页面本身上出现此错误。
error on line 24 at column 70: expected '>'
Below is a rendering of the page up to the first error.
我正在使用来自其他网站的外部Feed,这不是我可以控制或编辑的。
我正在使用XSLT和ColdFusion文件来读取外部RSS文件,并在我的XSLT中以我想要的方式显示它,我已经到位disable-output-escaping="yes"
以防止丢失代码显示在Feed中。当此标记不存在时,我的XSLT正常工作
我试图绕过它,但没有运气。实际上可以这样做吗?
CFM
<cfcontent type="application/xhtml+xml" reset="yes">
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">
<cfhttp method="Get" url="http://www.animenewsnetwork.com/news/rss.xml">
<cfset xmlInput = CFHTTP.FileContent>
<cfset MyXslFile = Expandpath("animenewsrss.xsl")>
<cffile action="READ" variable="xslInput" file="#MyXslFile#">
<cfset xmlOutput = XMLTransform(xmlInput, xslInput)>
<cfoutput>#xmloutput#</cfoutput>
XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:template match="rss/channel">
<xsl:element name="html">
<xsl:element name="head">
<xsl:element name="title">Anime News</xsl:element>
</xsl:element>
<xsl:element name="body">
<xsl:element name="div"><xsl:attribute name="id"><xsl:value-of select="'hstyle'"/></xsl:attribute>Media Events UK - Anime News</xsl:element>
<xsl:element name="div"><xsl:attribute name="id"><xsl:value-of select="'nstyle'"/>
</xsl:attribute><xsl:element name="a"><xsl:attribute name="href">index.cfm</xsl:attribute>Home</xsl:element> -
<xsl:element name="a"><xsl:attribute name="href">listings.cfm</xsl:attribute>Listings</xsl:element> -
<xsl:element name="a"><xsl:attribute name="href">venue.cfm</xsl:attribute>Venues</xsl:element>
</xsl:element>
<xsl:apply-templates select="item[position() < 6]" />
</xsl:element>
</xsl:element>
</xsl:template>
<xsl:template match="item[position() < 6]">
<div class="rsstyle">
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="link"/>
</xsl:attribute>
<xsl:value-of select="title" />
</xsl:element>
<xsl:element name="div">
<xsl:value-of select="pubDate" />
</xsl:element>
<xsl:element name="div">
<xsl:value-of select="concat(substring(description, 1, 50), '...')" disable-output-escaping="yes"/>
</xsl:element>
</div>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:5)
使用此行
<xsl:value-of select="concat(substring(description, 1, 50), '...')" disable-output-escaping="yes"/>
在某些情况下,您剪切了<description>
的内容,其中包含cite
个元素。这导致结果HTML
中的行如下所示:
<div><cite>Ni No Kuni</cite>, <cite>Tales of Xillia</ci...</div>
如您所见,cite
元素不再正常关闭,因为您将description
元素的内容剪切为50个字符。如果您对字符进行了计数,则会注意到description
的内容在50处停止,然后插入“...”。
如果您描述了将子字符串应用于decription
元素的意图,那么SO可以帮助您找到一个很好的替代方案。
我的猜测是,您需要考虑description
不仅包含文字,还包含元素(如cite
)的可能性。然后,仅在描述的文本内容上使用子字符串是有意义的,如下所示:
concat(substring(description/text(),1,50),'...')
然后继续捕捉description
的子元素,例如在一个单独的模板中:
<xsl:template match="cite[parent::description]">
<!--Deal with cite elements-->
</xsl:template>
编辑:我调整了您的样式表来处理cite
元素作为description
的子元素。有2个额外的模板可以处理文本节点和cite
节点,这两个节点都是description
的子节点。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:template match="rss/channel">
<!--I left this template unchanged!-->
</xsl:template>
<xsl:template match="item[position() < 6]">
<div class="rsstyle">
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="link"/>
</xsl:attribute>
<xsl:value-of select="title" />
</xsl:element>
<xsl:element name="div">
<xsl:value-of select="pubDate" />
</xsl:element>
<xsl:element name="div">
<xsl:apply-templates select="description"/>
</xsl:element>
</div>
</xsl:template>
<xsl:template match="description">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="text()[parent::description]">
<xsl:copy/>
</xsl:template>
<xsl:template match="cite[parent::description]">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>