2010-05-14 15 views
13

के साथ जेएसओएन लिखना मैं एक विशिष्ट वेब पेज को JSON में बदलने के लिए एक्सएसएलटी लिखने की कोशिश कर रहा हूं। निम्नलिखित कोड दर्शाता है कि रूबी इस रूपांतरण को कैसे करेगा, लेकिन एक्सएसएलटी वैध JSON उत्पन्न नहीं करता है (सरणी के अंदर एक बहुत सी कॉमा है) - किसी को भी पता है कि वैध JSON उत्पन्न करने के लिए 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> 

उत्तर

19

for-each अंदर लाइन से अल्पविराम छोड़ और जोड़ें:

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

यह पिछले एक को छोड़कर प्रत्येक आइटम के लिए एक अल्पविराम जोड़ देगा।

+3

आईएमएचओ, स्थिति() एक्सएसएलटी की एकमात्र फ्लैश-ऑफ-प्रतिभा सुविधा है। –

5

अलग-अलग टेम्पलेट्स में अपने एक्सएसएलटी को विभाजित करने से पठनीयता में वृद्धि हो सकती है।

<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

इसके बजाय साइटकोर आइटम वेब एपीआई का उपयोग क्यों नहीं करें? यह एसडीएन पर उपलब्ध है और एक साधारण प्लगइन के रूप में स्थापित है। जब यह स्थापित किया जाता है तो आप जेएसओएन के रूप में आइटम वापस पाने के लिए आरईएसटी का उपयोग कर सकते हैं। वस्तुओं की खोज करना संभव है और आप JSON के माध्यम से उपलब्ध व्यक्तिगत फ़ील्ड के लिए सुरक्षा सेट कर सकते हैं। इसके अलावा आप वास्तव में आरईएसटी और जेएसओएन का उपयोग कर साइटकोर आइटम बना सकते हैं, हटा सकते हैं और अपडेट कर सकते हैं।

+1

बेशक, आपके प्रश्न के समय आइटम वेब एपीआई उपलब्ध नहीं था :-) – Zooking

+0

क्या यह टिप्पणी पोस्ट से संबंधित है (http://stackoverflow.com/questions/2837809/writing-json-with-xslt)? यदि हां, तो आपको क्या लगता है कि यह एक साइटकोर प्रश्न था - यदि नहीं, तो कहीं कहीं भी एक बग होना चाहिए और यह भ्रमित हो रहा है। –