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