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 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)