2012-01-23 9 views
6

Tworzę mały niestandardowy plik XSL do renderowania kanału RSS. Zawartość jest podstawowa, jak następuje. Działa to bezbłędnie, z wyjątkiem sytuacji, gdy źródłowy plik XML zawiera wiersz "xmlns =" ​​http://www.w3.org/2005/Atom "w definicji pliku danych. Jak mam to rozwiązać? Nie jestem wystarczająco zaznajomiony z przestrzeniami nazw, aby wiedzieć, jak rozliczyć ten przypadek.Tworzenie XSL dla kanału 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> 

Odpowiedz

8

umieścić deklarację przestrzeni nazw w XSLT, tak:

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

Należy pamiętać, że przestrzeń nazw ATOM jest zarejestrowany z prefiksem atom: i stosowany we wszystkich XPath w całym arkuszu stylów. Użyłem exclude-result-prefixes, aby upewnić się, że atom: nie pojawi się w wynikowym dokumencie.

Należy również pamiętać, że zastąpiłem Twój szablon <xsl:for-each>. Powinieneś też tego unikać - na korzyść szablonów.

Używanie disable-output-escaping="yes" jest dość niebezpieczne w połączeniu z XHTML - chyba że jesteś całkowicie przekonany, że zawartość summary to również dobrze sformułowany XHTML.

+0

Jestem pewien, że XHTML jest bezpieczny - pochodzi z wewnętrznego źródła. Dzięki za pomoc. –