หัดใช้ XSLT

04 Aug 2007

ปกติผมใช้ Google Reader อ่าน feed ซึ่งตัว GR เนี่ยก็จะมีความสามารถนึงคือ shared item ที่ให้สามารถเอาเรื่องไหนก็ได้มา share ให้คนอื่น ทีนี้ถ้าจะเอามาติดก็ใช้ wdiget ที่กูเกิลเตรียมให้มาแปะไว้ในหน้าเว็บเอา วิธีก็ง่ายดี สะดวกด้วย แต่หน้าตามันไม่สวย ปรับแต่งเองลำบากหน่อยนึง

ทีนี้ถ้าเราจะเอามาใช้ ก็ง่ายๆ Google Reader มี feed สำหรับ Shared Item ให้ ก็เลยคิดว่าจะลองเอามาใช้หัดเล่น XSLT ดู

reader-shared

ก่อนอื่นก็สร้างไฟล์ XSLT สำหรับแปลงไฟล์ XML ขึ้นมาก่อน โดยจะให้ผลลัพธ์ของไฟล์อยู่ในรูป

<h3>Title ของ RSS</h3>

<ul>

<li><a href="permalink">ลิงค์ไปเนื้อหา</a></li>

...

</ul>

จะได้ไฟล์ XSLT แบบนี้

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:gr="http://www.google.com/schemas/reader/atom/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom">
    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/atom:feed">
        <h3>
            <xsl:value-of select="atom:title"/>
        </h3>
        <ul>
            <xsl:apply-templates select="atom:entry"/>
        </ul>
    </xsl:template>
    <xsl:template match="atom:entry">
        <li>
            <a href="{atom:link/@href}">
                <xsl:value-of select="atom:title"/>
            </a>
        </li>
    </xsl:template>
</xsl:stylesheet>

กว่าจะรู้เกี่ยวกับไอ้ตรงที่ทำตัวหนาไว้นี่กินเวลาไปหลายวันทีเดียว ก่อนอื่นเราต้องประกาศ namespace ของ atom ที่จะใช้กับ feed ของเราก่อน เพราะว่า feed ของเราใช้ namespace ของ atom เป็น namspace หลัก หลังจากนี้เวลาที่เราอ้างอิงถึง element ใน feed ก้ใช้ atom: นำหน้าเพื่อให้รู้ว่าเราหมายถึง element ไหน

ทีนี้ก็ลองสร้าง Console Application ที่ใช้ Xslt นี้ขึ้นมา

class Program {
    static void Main(string[] args) {

XmlReader reader = XmlTextReader.Create("http://www.google.com/reader/public/atom/user/14671298264700078722/state/com.google/broadcast");

XmlWriterSettings settings = new XmlWriterSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;

StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlTextWriter.Create(sb, settings);

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("feed.xslt");
xslt.Transform(reader, writer);

Console.WriteLine(sb.ToString());

ตรงนี้ต้องระบุให้ ConformanceLevel ให้เป็น Fragment เพราะผลลัพธ์ที่ออกมาจากการ Transform ไม่ใช้เอกสาร XML แต่เป็นส่วนหนึ่งของ XML หลังจากนั้นก็ยัด XML ที่อ่านมาเข้าไปใน XSLT แล้วก็จัดการ Transform ปุ๊บ ก็ได้ออกมาอยู่ใน StringBuilder เป็นอันเสร็จสิ้น

พอลองรันดูก็ได้ผลลัพธ์ออกมาแบบนี้

reader-shared2

ปล. Shared Item ทางขวา ใช้ clip ปกติที่ Google เตรียมให้

Technorati tags: , , ,

Comments

Post new comment

The content of this field is kept private and will not be shown publicly.