2010-05-14 14 views
13

Estoy tratando de escribir XSLT para transformar una página web específica a JSON. El siguiente código demuestra cómo haría Ruby esta conversión, pero el XSLT no genera JSON válido (hay demasiadas comas dentro de la matriz): ¿alguien sabe cómo escribir XSLT para generar JSON válido?Escribiendo JSON con XSLT

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> 

Respuesta

19

omitir la coma de la línea dentro de la for-each y añadir:

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

Esto añade una coma para cada elemento, excepto el último.

+3

En mi humilde posición, la posición() es la única característica de flash-of-genius de XSLT. –

5

La división de su XSLT en plantillas separadas puede aumentar la legibilidad.

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

Además, los valores de la artista y la canción se pueden romper su JSON si contienen comillas simples, en sustitución de las comillas simples podría ser necesario.

0

¿Por qué no utilizar Sitecore Item Web API en su lugar? Está disponible en SDN y se instala como un simple complemento. Cuando está instalado, puede usar REST para recuperar los elementos como JSON. Es posible buscar elementos y puede establecer la seguridad de los campos individuales disponibles a través de JSON. Además, puedes crear, eliminar y actualizar elementos de Sitecore usando REST y JSON.

+1

Por supuesto, en el momento de su pregunta, la API Web del artículo no estaba disponible :-) – Zooking

+0

¿Este comentario está relacionado con la publicación (http://stackoverflow.com/questions/2837809/writing-json-with-xslt)? Si es así, ¿qué te hizo pensar que esta era una pregunta de Sitecore? Si no, debe haber un error en SO en algún lado y se está confundiendo. –