2010-05-14 18 views
13

Ich versuche, XSLT zu schreiben, um eine bestimmte Webseite in JSON umzuwandeln. Der folgende Code demonstriert, wie Ruby diese Konvertierung durchführen würde, aber das XSLT erzeugt kein gültiges JSON (es gibt ein zu viel Komma innerhalb des Arrays) - weiß jemand, wie man XSLT schreibt, um gültiges JSON zu generieren?JSON mit XSLT schreiben

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::HTML(open('http://bbc.co.uk/radio1/playlist')) 
xslt = Nokogiri::XSLT(DATA.read) 

puts out = xslt.transform(doc) 

# Now follows the XSLT 
__END__ 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="text" encoding="UTF-8" media-type="text/plain"/> 

    <xsl:template match="/"> 
     [ 
     <xsl:for-each select="//*[@id='playlist_a']//div[@class='artists_and_songs']//ul[@class='clearme']"> 
      {'artist':'<xsl:value-of select="li[@class='artist']" />','track':'<xsl:value-of select="li[@class='song']" />'}, 
     </xsl:for-each> 
     ] 
    </xsl:template> 
</xsl:stylesheet> 

Antwort

19

auslassen das Komma von der Linie innerhalb des for-each und fügen:

<xsl:if test="position() != last()">,</xsl:if> 

Dieses ein Komma jedes Element mit Ausnahme des letzten hinzufügen.

+3

IMHO, Position() ist XSLTs einzige geniale Funktion. –

5

Das Aufteilen Ihres XSLT in separate Vorlagen kann die Lesbarkeit verbessern.

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml" 
> 
    <xsl:output method="text" encoding="UTF-8" media-type="text/plain"/> 

    <xsl:template match="/"> 
    <xsl:text>[</xsl:text> 
    <xsl:apply-templates select="//div[@id='playlist_a']//ul[@class='clearme']" /> 
    <xsl:text>]</xsl:text> 
    </xsl:template> 

    <xsl:template match="ul"> 
    <xsl:text>{'artist':'</xsl:text><xsl:value-of select="li[@class='artist']" /> 
    <xsl:text>','track':'</xsl:text><xsl:value-of select="li[@class='song']" /> 
    <xsl:text>'}</xsl:text> 
    <xsl:if test="position() &lt; last()">,</xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Auch die Werte von Künstler und Song können Ihre JSON brechen, wenn sie einfache Anführungszeichen enthalten könnte notwendig sein, um einfache Anführungszeichen zu ersetzen.

0

Warum nicht stattdessen die Sitecore-Objekt-Web-API verwenden? Es ist auf SDN verfügbar und wird als einfaches Plugin installiert. Nach der Installation können Sie mit REST Elemente als JSON zurückholen. Sie können nach Elementen suchen und die Sicherheit für die einzelnen Felder festlegen, die über JSON verfügbar sind. Außerdem können Sie Sitecore-Elemente mit REST und JSON erstellen, löschen und aktualisieren.

+1

Natürlich war zum Zeitpunkt Ihrer Frage die Item Web API nicht verfügbar :-) – Zooking

+0

Ist dieser Kommentar mit dem Beitrag verwandt (http://stackoverflow.com/questions/2837809/writing-json-with-xslt)? Wenn ja, was hat Sie dazu gebracht zu glauben, dass dies eine Sitecore-Frage war - wenn nicht, dann muss es irgendwo einen Fehler in SO geben, und er wird verwirrt. –