使用XSL将Apple XML转换为HTML

问题描述:

I have to format Apple RSS feeds to show the top iphone apps in a website. I downloaded XML files and thought it'd be simple to apply an stylesheet but its turning a heck of a job... Here is the XSL iam trying to apply: pretty simple

<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 feeds I am trying to format can be downloaded from http://itunes.apple.com/rss/generator/ (Choose iOS Apps and click generate).

Please help on this.. the XML file does not change whatever changes I make to the XSL file, it always displays the whole contents of the XML file..

I could find only one topic on this on the Internet and it also does not has a working solution. It should be quite familiar issue if people are showing websites with i-tunes apps these days.

我必须格式化Apple RSS提要以显示网站中的*iPhone应用程序。 我下载了XML文件,并认为应用样式表很简单,但它变成了工作...... 这是XSL iam尝试应用:非常简单 p>

 &lt; 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“&gt; 
 
&lt; xsl:template match =”/“&gt; 
 
 
&lt; tr&gt; 
&lt; th&gt;  ; ID&lt; / th&gt; 
&lt; th&gt;标题&lt; / th&gt; 
&lt; / tr&gt; 
&lt; xsl:for-each select =“entry”&gt; 
&lt; tr&gt; 
&lt; td&gt;&lt;  ; xsl:value-of select =“id”/&gt;&lt; / td&gt; 
&lt; td&gt;&lt; xsl:value-of select =“title”/&gt;&lt; / td&gt; 
&lt; td&gt;  ;&lt; xsl:value-of select =“category”/&gt;&lt; / td&gt; 
 
&lt; / tr&gt; 
&lt; / xsl:for-each&gt; 
 
&lt; / xsl:template&gt; \  n 
&lt; / xsl:stylesheet&gt; 
  code>  pre> 
 
 

我尝试格式化的XML Feed可以从 http://itunes.apple.com/rss/generator/ (选择iOS应用程序并点击基因 请帮忙。对于XSL文件,XML文件不会改变任何更改,它总是显示XML文件的全部内容.. p >

我在互联网上只能找到一个相关主题,而且它也没有可行的解决方案。 如果人们现在用i-tunes应用程序显示网站应该是非常熟悉的问题。 p> div>

I think the problem you are having is with namespaces. You are not properly accounting for them in your XSLT. Looking at a sample feed, the root element is as follows:

<feed xmlns:im="http://itunes.apple.com/rss" xmlns="http://www.w3.org/2005/Atom" xml:lang="en">

This means that, unless otherwise specified, all elements are part of the namespace with URI "http://www.w3.org/2005/Atom". Although you have declared this in your XSLT, you are not really using it, and your XSLT code is trying to match elements that are not part of any namespace.

There is also a problem is that your XSLT is not accounting for the feed element too. What you need to do is replace the initial template match of <xsl:template match="/"> with the following

<xsl:template match="/atom:feed">

You xsl:for-each would then become like so

<xsl:for-each select="atom:entry"> 

Here is the full 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>

This should hopefully output some results.

Note that it is often better to use template matching, rather than xsl:for-each to encourage re-use of templates, and tidier code with less indentation. This would also work

<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>