douding7189 2012-06-04 06:46
浏览 53
已采纳

使用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.

  • 写回答

1条回答 默认 最新

  • douyi3767 2012-06-04 09:03
    关注

    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>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器