我必须格式化Apple RSS提要以显示网站中的顶级iPhone应用程序。我下载了XML文件,并认为应用样式表很简单,但它变得很糟糕...... 这是XSL iam尝试申请:非常简单
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:im="http://itunes.apple.com/rss">
<xsl:template match="/">
<tr>
<th>ID</th>
<th>Title</th>
</tr>
<xsl:for-each select="entry">
<tr>
<td><xsl:value-of select="id"/></td>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="category"/></td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我尝试格式化的XML Feed可以从http://itunes.apple.com/rss/generator/下载(选择iOS应用并点击生成)。
请帮忙... XML文件不会改变我对XSL文件所做的任何更改,它总是显示XML文件的全部内容..
我只能在互联网上找到一个这方面的主题,而且它也没有可行的解决方案。如果人们现在用i-tunes应用程序显示网站,那应该是非常熟悉的问题。
答案 0 :(得分:2)
我认为你遇到的问题是命名空间。您在XSLT中没有正确地考虑它们。查看示例Feed,根元素如下:
<feed xmlns:im="http://itunes.apple.com/rss" xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
这意味着,除非另有说明,否则所有元素都是URI“http://www.w3.org/2005/Atom”的命名空间的一部分。虽然您已在XSLT中声明了这一点,但您并没有真正使用它,并且您的XSLT代码正在尝试匹配不属于任何命名空间的元素。
还有一个问题是您的XSLT也没有考虑 feed 元素。您需要做的是将<xsl:template match="/">
的初始模板匹配替换为以下
<xsl:template match="/atom:feed">
xsl:for-each 会变得如此
<xsl:for-each select="atom:entry">
这是完整的XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:im="http://itunes.apple.com/rss">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/atom:feed">
<tr>
<th>ID</th>
<th>Title</th>
</tr>
<xsl:for-each select="atom:entry">
<tr>
<td>
<xsl:value-of select="atom:id"/>
</td>
<td>
<xsl:value-of select="atom:title"/>
</td>
<td>
<xsl:value-of select="atom:category/@label"/>
</td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
这应该会产生一些结果。
请注意,通常最好使用模板匹配,而不是 xsl:for-each 来鼓励重复使用模板,以及使用较少缩进的更整洁的代码。这也可行
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:im="http://itunes.apple.com/rss">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/atom:feed">
<tr>
<th>ID</th>
<th>Title</th>
</tr>
<xsl:apply-templates select="atom:entry"/>
</xsl:template>
<xsl:template match="atom:entry">
<tr>
<td>
<xsl:value-of select="atom:id"/>
</td>
<td>
<xsl:value-of select="atom:title"/>
</td>
<td>
<xsl:value-of select="atom:category/@label"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>