Создание XSL для канала Atom - PullRequest
6 голосов
/ 23 января 2012

Я создаю небольшой пользовательский XSL-файл для рендеринга RSS-канала.Содержание является основным, следующим образом.Это работает безупречно, за исключением случаев, когда исходный XML-файл содержит строку 'xmlns = "http://www.w3.org/2005/Atom"' в определении фида. Как мне это решить? Я недостаточно знаком с пространствами имен, чтобы знать, как учитывать этот случай.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/" >
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
  <body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
  <xsl:for-each select="feed/entry">
      <div style="background-color:teal;color:white;padding:4px">
        <span style="font-weight:bold"><xsl:value-of select="title"/></span> - <xsl:value-of select="author"/>
      </div>
      <div style="margin-left:20px;margin-bottom:1em;font-size:10pt">
        <b><xsl:value-of select="published" /> </b>
        <xsl:value-of select="summary"  disable-output-escaping="yes" />
      </div>
    </xsl:for-each>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

1 Ответ

8 голосов
/ 23 января 2012

Вы помещаете объявление пространства имен в XSLT, например:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:atom="http://www.w3.org/2005/Atom"
  exclude-result-prefixes="atom"
>
  <xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
        <xsl:apply-tepmplates select="atom:feed/atom:entry" />
      </body>
    </html>
  </xsl:template>

  <xsl:template match="atom:entry">
    <div style="background-color:teal;color:white;padding:4px">
      <span style="font-weight:bold">
        <xsl:value-of select="atom:title"/>
      </span>
      <xsl:text> - </xsl:text>
      <xsl:value-of select="atom:author"/>
    </div>
    <div style="margin-left:20px;margin-bottom:1em;font-size:10pt">
      <b><xsl:value-of select="atom:published" /> </b>
      <xsl:value-of select="atom:summary"  disable-output-escaping="yes" />
    </div>
  </xsl:template>
</xsl:stylesheet>

Обратите внимание, что пространство имен ATOM зарегистрировано с префиксом atom: и используется во всех XPath по всей таблице стилей. Я использовал exclude-result-prefixes, чтобы убедиться, что atom: не будет отображаться в полученном документе.

Также обратите внимание, что я заменил ваш <xsl:for-each> на шаблон. Вы также должны стараться избегать каждого в пользу шаблонов.

Использование disable-output-escaping="yes" несколько опасно в сочетании с XHTML - если только вы не уверены, что содержимое summary также является правильно сформированным XHTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...