Написание JSON с XSLT - PullRequest
       5

Написание JSON с XSLT

14 голосов
/ 15 мая 2010

Я пытаюсь написать XSLT для преобразования конкретной веб-страницы в JSON. Следующий код демонстрирует, как Ruby будет выполнять это преобразование, но XSLT не генерирует допустимый JSON (в массиве слишком много запятых) - кто-нибудь знает, как написать XSLT для генерирования действительного JSON?

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>

Ответы [ 3 ]

20 голосов
/ 15 мая 2010

Опустите запятую в строке внутри for-each и добавьте:

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

Это добавит запятую к каждому элементу, кроме последнего.

5 голосов
/ 15 мая 2010

Разделение вашего XSLT на отдельные шаблоны может улучшить читаемость.

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

Кроме того, значения исполнителя и песни могут нарушить ваш JSON, если они содержат одинарные кавычки, поэтому может потребоваться замена одинарных кавычек.

0 голосов
/ 28 февраля 2013

Почему бы вместо этого не использовать веб-API Sitecore Item? Он доступен на SDN и устанавливается как простой плагин. Когда он установлен, вы можете использовать REST для возврата элементов в формате JSON. Можно искать элементы, и вы можете установить безопасность для отдельных полей, доступных через JSON. В дальнейшем вы можете создавать, удалять и обновлять элементы Sitecore, используя REST и JSON.

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