XSL Dönüşümleri (XSLT) Sürüm 1.0 | ||
---|---|---|
Önceki | Yukarı | Sonraki |
Bu örnekte, basit bir DTD ile uyumlu belgeleri XHTML'ye [XHTML] dönüştürmek için bir biçembent kullanımı gösterilmiştir. DTD şöyledir:
<!ELEMENT doc (title, chapter*)> <!ELEMENT chapter (title, (para|note)*, section*)> <!ELEMENT section (title, (para|note)*)> <!ELEMENT title (#PCDATA|emph)*> <!ELEMENT para (#PCDATA|emph)*> <!ELEMENT note (#PCDATA|emph)*> <!ELEMENT emph (#PCDATA|emph)*>
Biçembent böyle:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict"> <xsl:strip-space elements="doc chapter section"/> <xsl:output method="xml" indent="yes" encoding="iso-8859-9" /> <xsl:template match="doc"> <html> <head> <title> <xsl:value-of select="title"/> </title> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="doc/title"> <h1> <xsl:apply-templates/> </h1> </xsl:template> <xsl:template match="chapter/title"> <h2> <xsl:apply-templates/> </h2> </xsl:template> <xsl:template match="section/title"> <h3> <xsl:apply-templates/> </h3> </xsl:template> <xsl:template match="para"> <p> <xsl:apply-templates/> </p> </xsl:template> <xsl:template match="note"> <p class="note"> <b>BİLGİ: </b> <xsl:apply-templates/> </p> </xsl:template> <xsl:template match="emph"> <em> <xsl:apply-templates/> </em> </xsl:template> </xsl:stylesheet>
Kaynak belgemiz böyle olsaydı:
<!DOCTYPE doc SYSTEM "doc.dtd"> <doc> <title>Belge Başlığı</title> <chapter> <title>Fasıl Başlığı</title> <section> <title>Bölüm Başlığı</title> <para>Bu bir denemedir.</para> <note>Bu bir ek bilgidir.</note> </section> <section> <title>Başka Bir Bölüm Başlığı</title> <para>Bu da <emph>başka</emph> bir DNMdir.</para> <note>Bu bir ek malumattır.</note> </section> </chapter> </doc>
Üretilecek hedef belgemiz böyle olurdu:
<?xml version="1.0" encoding="iso-8859-9"?> <html xmlns="http://www.w3.org/TR/xhtml1/strict"> <head> <title>Belge Başlığı</title> </head> <body> <h1>Belge Başlığı</h1> <h2>Fasıl Başlığı</h2> <h3>Bölüm Başlığı</h3> <p>Bu bir denemedir.</p> <p class="note"> <b>BİLGİ: </b>Bu bir ek bilgidir.</p> <h3>Başka Bir Bölüm Başlığı</h3> <p>Bu da <em>başka</em> bir DNMdir.</p> <p class="note"> <b>BİLGİ: </b>Bu ilaveten diğer bir malumattır.</p> </body> </html>
Bu örnekte, bir XML belge olarak tutulan veriden üç farklı biçembent kullanarak verinin üç farklı gösterimi (HTML, SVG ve VRML) elde edilmektedir.
Veri girdimiz:
<satışlar> <bölge id="Kuzey"> <gelir>10</gelir> <artış>9</artış> <ikram>7</ikram> </bölge> <bölge id="Güney"> <gelir>4</gelir> <artış>3</artış> <ikram>4</ikram> </bölge> <bölge id="Batı"> <gelir>6</gelir> <artış>-1.5</artış> <ikram>2</ikram> </bölge> </sales>
Aşağıdaki biçembent, Birebir Hedef Eleman olarak Biçembent bölümünde açıklanan basitleştirilmiş sözdizimini kullanarak veriyi HTML'ye dönüştürmek içindir:
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" lang="tr"> <head> <title>Bölgelere göre Satış Sonuçları</title> </head> <body> <table border="1"> <tr> <th>Bölge</th> <th>Gelir</th> <th>Büyüme</th> <th>İkramiye</th> </tr> <xsl:for-each select="satışlar/bölge"> <!-- sonuçları gelire göre sırala --> <xsl:sort select="gelir" data-type="number" order="descending"/> <tr> <td> <em><xsl:value-of select="@id"/></em> </td> <td> <xsl:value-of select="gelir"/> </td> <td> <!-- büyüme aslında küçülmeyse kırmızı göster --> <xsl:if test="artış < 0"> <xsl:attribute name="style"> <xsl:text>color:red</xsl:text> </xsl:attribute> </xsl:if> <xsl:value-of select="artış"/> </td> <td> <xsl:value-of select="ikram"/> </td> </tr> </xsl:for-each> </table> </body> </html>
The HTML output is:
<html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9"> <title>Bölgelere göre Satış Sonuçları</title> </head> <body> <table border="1"> <tr> <th>Bölge</th><th>Gelir</th><th>Büyüme</th><th>İkramiye</th> </tr> <tr> <td><em>Kuzey</em></td><td>10</td><td>9</td><td>7</td> </tr> <tr> <td><em>Batı</em></td><td>6</td><td style="color:red">-1.5</td><td>2</td> </tr> <tr> <td><em>Güney</em></td><td>4</td><td>3</td><td>4</td> </tr> </table> </body> </html>
Bu biçembent veriyi SCG'ye dönüştürmek içinder:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/Graphics/SVG/SVG-19990812.dtd"> <xsl:output method="xml" indent="yes" media-type="image/svg"/> <xsl:template match="/"> <svg width = "3in" height="3in"> <g style = "stroke: #000000"> <!-- eksenlere çiz --> <line x1="0" x2="150" y1="150" y2="150"/> <line x1="0" x2="0" y1="0" y2="150"/> <text x="0" y="10">Gelir</text> <text x="150" y="165">Bölüm</text> <xsl:for-each select="satışlar/bölüm"> <!-- bazı yararlı değişkenleri tanımlayalım --> <!-- çubuğun x konumu --> <xsl:variable name="pos" select="(position()*40)-30"/> <!-- çubuğun yüksekliği --> <xsl:variable name="height" select="gelir*10"/> <!-- dikdörtgen --> <rect x="{$pos}" y="{150-$height}" width="20" height="{$height}"/> <!-- metinsel yafta --> <text x="{$pos}" y="165"> <xsl:value-of select="@id"/> </text> <!-- çubuk değeri --> <text x="{$pos}" y="{145-$height}"> <xsl:value-of select="gelir"/> </text> </xsl:for-each> </g> </svg> </xsl:template> </xsl:stylesheet>
SVG çıktısı:
<svg width="3in" height="3in" xmlns="http://www.w3.org/Graphics/SVG/svg-19990412.dtd"> <g style="stroke: #000000"> <line x1="0" x2="150" y1="150" y2="150"/> <line x1="0" x2="0" y1="0" y2="150"/> <text x="0" y="10">Gelir</text> <text x="150" y="165">Bölüm</text> <rect x="10" y="50" width="20" height="100"/> <text x="10" y="165">Kuzey</text> <text x="10" y="45">10</text> <rect x="50" y="110" width="20" height="40"/> <text x="50" y="165">Güney</text> <text x="50" y="105">4</text> <rect x="90" y="90" width="20" height="60"/> <text x="90" y="165">Batı</text> <text x="90" y="85">6</text> </g> </svg>
Aşağıdaki biçembent veriyi VRML'ye dönüştürmek içindir:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- metni, öntanımlı karakter kümesini kullanarak model/vrmlmime türünde üretelim --> <xsl:output method="text" encoding="UTF-8" media-type="model/vrml"/> <xsl:template match="/">#VRML V2.0 utf8 # tek bir bar elemanının externproto tanımı EXTERNPROTO bar [ field SFInt32 x field SFInt32 y field SFInt32 z field SFString name ] "http://www.vrml.org/WorkingGroups/dbwork/barProto.wrl" # taşıyıcı çizge eksenlerini satıriçine alalım Inline { url "http://www.vrml.org/WorkingGroups/dbwork/barAxes.wrl" } <xsl:for-each select="satışlar/bölüm"> bar { x <xsl:value-of select="gelir"/> y <xsl:value-of select="artış"/> z <xsl:value-of select="ikram"/> name "<xsl:value-of select="@id"/>" } </xsl:for-each> </xsl:template> </xsl:stylesheet>
VRML çıktısı:
#VRML V2.0 utf8 # tek bir bar elemanının externproto tanımı EXTERNPROTO bar [ field SFInt32 x field SFInt32 y field SFInt32 z field SFString name ] "http://www.vrml.org/WorkingGroups/dbwork/barProto.wrl" # taşıyıcı çizge eksenlerini satıriçine alalım Inline { url "http://www.vrml.org/WorkingGroups/dbwork/barAxes.wrl" } bar { x 10 y 9 z 7 name "Kuzey" } bar { x 4 y 3 z 4 name "Güney" } bar { x 6 y -1.5 z 2 name "Batı" }
Önceki | Yukarı | Sonraki |
XSLT Biçembentlerinde DTD Bölümü | Bir Linux Kitaplığı Sayfası | Teşekkür |