所以我正在尝试编写一个XSLT脚本,该脚本将YouTube播放列表的默认RSS提要转换为视觉上更令人愉悦的格式。 我想我的代码或多或少已经关闭了,但我遇到了我认为命名空间的问题。
基本上,有一个<yt:videoid>
和一个<media:description>
标签,我的 XSLT 解析器似乎窒息了,我真的不确定如何修复它(原始文档中从未定义过命名空间)。 我的代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="feed/entry">
<item>
<title><xsl:value-of select="title" /></title>
<description>
<![CDATA[<img src="http://i.ytimg.com/vi/{yt:videoid}/hqdefault.jpg">
<br />
<br />
<xsl:value-of select="media:description">
<br />
<br />
<iframe width="560" height="315" src="http://www.youtube.com/embed/{yt:videoid}" frameborder="0" allowfullscreen></iframe>]]>
</description>
<link>http://www.youtube.com/watch?v={yt:videoid}</link>
<guid isPermaLink="false">http://www.youtube.com/watch?v={yt:videoid}</guid>
<pubDate><xsl:value-of select="updated" /></pubDate>
</item>
当我运行它时,它会编译一堆"Y 上的命名空间前缀 X 未定义"错误,并且我包含{yt:videoid}
或media:description
的任何地方都显示为纯文本而不是适当的值。
另一个更小的问题是 XML 文档是用
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007' gd:etag='W/"Ak8EQX47eCp7I2A9WhdSEkQ."'>
除非我手动将其剪切到<feed>
,否则它甚至不会解析. 同样,这是一个小得多的问题,我更愿意解决第一个问题。 如果有人有任何建议,我将不胜感激!
亚当
总结一下这个问题,XSLT 缺少 XML 中存在的命名空间。因此,如果 XML 包含以下命名空间:
xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/'
xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/'
xmlns:gd='http://schemas.google.com/g/2005'
xmlns:yt='http://gdata.youtube.com/schemas/2007'
您还需要将其添加到元素中。下面有一篇关于理解 XML 命名空间的好书:
http://msdn.microsoft.com/en-us/magazine/cc302166.aspx