2012-06-04 2 views
0

Мне нужно отформатировать Apple RSS-каналы, чтобы показывать лучшие приложения iphone на веб-сайте. Я скачал XML-файлы и думал, что это будет просто применить таблицу стилей, но превращение его чертовски работу ... Вот XSL IAM пытается применить: довольно простойApple XML to HTML с использованием XSL

<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-каналы Я пытаюсь для форматирования можно загрузить с http://itunes.apple.com/rss/generator/ (выберите «Приложения iOS» и нажмите «Создать»).

Пожалуйста, помогите в этом .. файл XML не изменяет то, что изменения, внесенные в файл XSL, он всегда отображает все содержимое файла XML ..

я смог найти только одну тему об этом на Интернет, и он также не имеет рабочего решения. Это должно быть довольно знакомой проблемой, если в наши дни люди показывают сайты с приложениями i-tunes.

ответ

2

Я думаю, что проблема, с которой вы сталкиваетесь, - это пространство имен. Вы не должным образом учитываете их в своем XSLT. Глядя на корма образца, корневой элемент следующим образом:

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

Это означает, что, если не указано иное, все элементы являются частью пространства имен с URI «http://www.w3.org/2005/ Атом". Хотя вы заявили об этом в своем XSLT, вы на самом деле не используете его, и ваш XSLT-код пытается сопоставить элементы, которые не являются частью какого-либо пространства имен.

Существует также проблема в том, что ваш XSLT не учитывает элемент . Что вам нужно сделать, это заменить первоначальный матч шаблон <xsl:template match="/"> со следующим

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

You XSL: для-каждого бы тогда как так

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

Огромное спасибо Тиму. Я очень благодарен за этот подробный ответ. Я опубликую решение на своем блоге, чтобы другие могли извлечь выгоду. Хорошего дня.. –

Смежные вопросы