XSL对包含RDF格式的RSS文件的解析

cer 2003-12-06 03:19:23
我的xsl文件的内容如下:
==========================================================================
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/REC-html40">
<xsl:output method="html"/>
<xsl:template match="/">
<HTML>
<HEAD>
<title>blog</title>
</HEAD>
<body>
<div align="center" style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid">
<table cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="2.3%">
<xsl:text disable-output-escaping="yes">&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
</td>
<td width="95%">
<table cellpadding="0" cellspacing="0" width="100%">
<xsl:apply-templates/>
<!--xsl:apply-templates select="./*"/-->
<!--xsl:value-of select="."/-->
</table>
</td>
<td width="2.5%">
<xsl:text disable-output-escaping="yes">&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
</td>
</tr>
</table>
</div>
</body>
</HTML>
</xsl:template>

<xsl:template match="item">
<tr>
<td height="10"/>
</tr>
<tr>
<td valign="middle" style="BORDER-TOP: darkgray 1px solid; FONT-WEIGHT: bold; FONT-SIZE: 20px; BORDER-BOTTOM: darkgray 1px solid; BACKGROUND-COLOR: #ffffcc">
<xsl:value-of select="./title"/>
</td>
</tr>
<tr>
<td height="10"/>
</tr>
<tr>
<td>
<!--xsl:variable name="ucase" select="'>'" />
<xsl:variable name="lcase" select="'>'" />
<xsl:variable name="content" select="./description" />
<xsl:value-of select="translate($content, '>', '>')"/-->
<xsl:value-of select="./description"/>
</td>
</tr>
<tr>
<td style="FONT-SIZE: 12px" align="right" height="25">
<xsl:value-of select="./pubDate"/> by
<A>
<xsl:attribute name="href"><xsl:value-of select="./link"/></xsl:attribute>
<xsl:value-of select="./creator"/>
</A>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>


==========================================================================

对:http://www.blogger.cn/MainFeed.aspx能正确的解析
但对含RDF的:http://www.dengjie.com/rss.asp的RSS不能很好的解析是为什么呢?
...全文
100 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cer 2003-12-07
  • 打赏
  • 举报
回复
谢谢 LeXRus(-7℃) 的回复,你给的xsl内容完全正确,我调试也通过了,但有点问题要问你:
1.<xsl:template match="/">是选择根目,但什么是根目录?是<?xml version="1.0" encoding="UTF-8"?>还是:<rdf:RDF xmlns:...... xmlns="http://purl.org/rss/1.0/">?

2.退过"/"到了根目录下,<xsl:apply-templates select="*/*"/>是选择任意结点的任意子结点,为什么我将第二个*改为"item"不行.

3.<xsl:value-of select="./*[name()='description']" disable-output-escaping="yes"/>
这一句是选择当前结点的description子结点,为什么我将他修改为:<xsl:value-of select="./description" disable-output-escaping="yes"/>不行?


静等您的回复
----------------------------------------张科峰上
Lex 2003-12-07
  • 打赏
  • 举报
回复
1. 根节点当然是rdf:RDF, 你可以用name()看一下
2. 问题二同问题三..把xmlns="http://purl.org/rss/1.0/"去掉就可以直接用./description
这个在msxml sdk 4参考里有一点说明:
An attribute xmlns="" undeclares the default namespace.
A namespace node has an expanded-name: the local part is the namespace prefix (this is empty if the namespace node is for the default namespace); the namespace Uniform Resource Identifier (URI) is always null.

The string-value of a namespace node is the namespace URI that is being bound to the namespace prefix; if it is relative, it must be resolved just like a namespace URI in an expanded-name.
Lex 2003-12-06
  • 打赏
  • 举报
回复
修改如下..
p.s.
xsl:value-of也有disable-output-escaping属性的, 不需要用translate来decode


<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/REC-html40">
<xsl:output method="html"/>
<xsl:template match="/">
<HTML>
<HEAD>
<title>blog</title>
</HEAD>
<body>
<div align="center" style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid">
<table cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="2.3%">
<xsl:text disable-output-escaping="yes">&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
</td>
<td width="95%">
<table cellpadding="0" cellspacing="0" width="100%">
<xsl:apply-templates select="*/*"/>
<!--xsl:apply-templates select="./*"/-->
<!--xsl:value-of select="."/-->
</table>
</td>
<td width="2.5%">
<xsl:text disable-output-escaping="yes">&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
</td>
</tr>
</table>
</div>
</body>
</HTML>
</xsl:template>

<xsl:template match="*/*">
<tr>
<td height="10"/>
</tr>
<tr>
<td valign="middle" style="BORDER-TOP: darkgray 1px solid; FONT-WEIGHT: bold; FONT-SIZE: 20px; BORDER-BOTTOM: darkgray 1px solid; BACKGROUND-COLOR: #ffffcc">
<xsl:value-of select="./*"/>
</td>
</tr>
<tr>
<td height="10"/>
</tr>
<tr>
<td>
<xsl:value-of select="./*[name()='description']" disable-output-escaping="yes"/>
</td>
</tr>
<tr>
<td style="FONT-SIZE: 12px" align="right" height="25">
<xsl:value-of select="./*[name()='dc:date']"/> by
<A>
<xsl:attribute name="href"><xsl:value-of select="./*[name()='link']"/></xsl:attribute>
<xsl:value-of select="./*[name()='dc:creator']"/>
</A>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
cer 2003-12-06
  • 打赏
  • 举报
回复
我发现:http://www.dengjie.com/rss.asp用XSL根本解析不了
如:我用下面这个最简单的都不行:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="//channel">
<xsl:value-of select="last()"/>
</xsl:template>
</xsl:stylesheet>


根本得不到什么
cer 2003-12-06
  • 打赏
  • 举报
回复
to:xpfd(东方晨雨)兄
这份资料我也有一份,但我写的xsl完全正确,但不知为什么就是不能解析:http://www.dengjie.com/rss.asp,因为这个是RSS1.0,而http://www.blogger.cn/MainFeed.aspx
则是RSS2.0
xpfd 2003-12-06
  • 打赏
  • 举报
回复
青苹果工作室编译,转自 ccidnet 网站
2001年03月16日

XSL(eXtensible Style sheet Language),即可扩展样式表语言,是XML的亲密伙伴。要学习好XML,不能不掌握XSL。本文就向你全面讲述XSL的一切一切:
客户端XSL:如何用XML解析器在客户机上将XML文档转换成HTML文档。

一个JavaScript的解决方法
在前文中,我们解释了如何用XSL将一个文档从XML转换成HTML。窍门就是向XML文件中增加一个XSL样式表,然后让浏览器来进行转换。即使这种方法能奏效,在XML文件中包含一个样式表引用也并非令人满意的方法,并且在不支持XSL的浏览器上这种方法还不能奏效。
一个更通用的方法应该是用一个JavaScript来进行从XML到HTML的转换。使用一个JavaScript,就更有以下可能性:

允许JavaScript进行浏览器细节测试;
根据浏览器和用户需求使用不同的样式表。
这就是XSL的美妙之处。XSL设计目的之一就是使数据从一个格式转换成另一个格式成为可能,从而支持不同的浏览器和不同的用户需求。
客户端XSL转换将成为未来浏览器工作任务的一个主要部分,我们还将看到专业化浏览器市场的成长,比如Braille、发声网络、网络打印机、手持PC、移动电话等。
XML文件和XSL文件
现在重新来看看前面章节中的XML文档:

<?xml version="1.0"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
.
.
.
还有附带的XSL样式表:
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<table border="2" bgcolor="yellow">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="CATALOG/CD">
<tr>
<td><xsl:value-of select="TITLE"/></td>
<td><xsl:value-of select="ARTIST"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

要确保XML文件没有对XSL文件的引用,XSL文件也没有对XML文件的引用。注意:上面的句子说明一个XML文件可以用许多不同的XSL文件进行转换。
在浏览器中将XML转换到HTML
以下是在客户机上将XML文件转换成HTML所需要的源代码,很简单:

<html>
<body>
<script language="javascript">
// Load XML
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false
xml.load("cd_catalog.xml")
// Load the XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("cd_catalog.xsl")
// Transform
document.write(xml.transformNode(xsl))
</script>
</body>
</html>

如果使用的是Internet Explorer 5.0 或更高版本,请点击这里查看结果。

代码的第一块创建了Microsoft XML 解析器(XMLDOM)的一个例示,并将XML文档加载到内存中。代码的第二块创建解析器的另一个例示,并将XSL文档加载到内存中。代码的最后一行用XSL文档转换XML文档,将结果写入HTML 文档中。

服务器端XSL:如何用XML解析器在服务器上将XML文档转换成HTML文档。

服务器端XSL
由于不是所有的浏览器都支持XML和XSL,因此就有了一个在服务器上将XML转换成HTML的方法。

一个跨浏览器的解决方法
在前面的章节中,我们解释了如何用XSL在浏览器中将XML文档转换成HTML,窍门就是让JavaScript使用一个XML解析器来进行转换。但是当浏览器不支持XML解析器时,这种方法是不奏效的。要使XML数据对所有浏览器都可用,我们就必须在服务器上转换XML文档,并将它作为纯HTML发送到浏览器。

这是XSL的另一个美妙之处。XSL的设计目的之一是使得在服务器上将数据从一种格式转换成另一种格式成为可能,并将可读数据返回到所有未来的浏览器中。

在服务器上进行XSL转换正在成为未来Internet信息服务器工作任务的一个主要部分,同时我们将看到专用浏览器市场的发展,如:Braille、有声网络、网络打印机、手持PC、移动电话等。

XML文件和XSL文件
现在来重新看看前面章节中的XML文档:

<?xml version="1.0"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
.
.
.

如果使用的是Internet Explorer 5.0或更高版本,可以点击这里查看XML文件。
再看看伴随的XSL样式表:
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<table border="2" bgcolor="yellow">
<tr>
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="CATALOG/CD">
<tr>
<td><xsl:value-of select="TITLE"/></td>
<td><xsl:value-of select="ARTIST"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

如果使用的是Internet Explorer 5.0或更高版本,可以点击这里查看XSL文件。
以上XSL文档的语法在前面章节中已经解释过了,因此这里不再做解释。但是要确保XML文件没有对XSL文件的引用,XSL文件也没有对XML文件的引用。同时请注意:上面的句子表明一个服务器上的XML文件可以用许多不同的XSL文件进行转换。

在服务器端将XML转换成HTML
以下是在服务器上转换XML文件所需要的简单源代码:

<%
'Load the XML
set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("cd_catalog.xml"))
'Load the XSL
set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(Server.MapPath("cd_catalog.xsl"))
'Transform the file
Response.Write(xml.transformNode(xsl))
%>

代码的第一块创建Microsoft XML解析器(XMLDOM)的一个例示,并将XML文件装载到内存中。代码的第二块创建解析器的另一个例示,并将XSL文档装载到内存。代码的最后一行用XSL文档转换XML文档,并将结果返回浏览器。
xpfd 2003-12-06
  • 打赏
  • 举报
回复
俺不会 但是希望看到结果
re~~~~~~~~~~

8,906

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧