Konuyu görüntüle
IUCODERS FORUM > Programlama > Diğer (COBOL,asp php js..) > Xml,xslt
Yazar
nightfall


avatar
Kahramanmaras
Kayıt: 18.11.2007
02.09.2009-10:08 #63221
Merhabalar,ben elimdeki bir xml dökümanını xslt kullanarak text formata dönüştürmek istiyorum.Mesela elimdeki xml;

<module name="Demo">
<struct name="DemoTopic">
<string>from</string>
<string>subject</string>
<long>id</long>
</struct>
</module>

Bunun dönüştürme işlemi sonunda;

module Demo {

struct DemoTopic {
string from;
string subject;
long id;
};

}; bu şekilde olmasını istiyorum.

Burda attributeları,ya da taglerin içindeki değerleri alabiliyorum.Ancak işaretleri ve boşlukları nasıl alabilirim?Yani benim xslt'im <string>from</string> bu ifadeyi gördüğünde "string from;" çıktısını vermeli.Benim yaptığımda texte sadece from yazıyor gerisini getiremiyorum.Bu özellikleri nasıl ekleyebilirim??Bu konuda bilgi sahibi olanlar yardım edebilirler miprayingpraying







Dunyanin tek madalyali sehri KAHRAMANMARAS...
FENERLI OLUNMAZ FENERLI DOGULUR!!!











Yazar
blackout


avatar

Kayıt: 11.12.2008
02.09.2009-12:46 #63223
Node adını almak istiyorsan name() veya local-name() fonksiyonunu kullanabilirsin. İşaretler ve boşluklardan tam olarak neyi kastediyorsun? Veri dosyasında bu veriler yoksa xsl içine kendin eklemen gerekir.

module <xsl:value-of select="@name" /> {
	<xsl:for-each select="struct">struct <xsl:value-of select="@name" /> {
		<xsl:for-each select="*"><xsl:value-of select="local-name()"/><xsl:text> </xsl:text><xsl:value-of select="node()"/>;
		</xsl:for-each>
	};</xsl:for-each>
};


gibi..





Yazar
nightfall


avatar
Kahramanmaras
Kayıt: 18.11.2007
02.09.2009-14:04 #63226
blackout yazdi
 
Node adını almak istiyorsan name() veya local-name() fonksiyonunu kullanabilirsin. İşaretler ve boşluklardan tam olarak neyi kastediyorsun? Veri dosyasında bu veriler yoksa xsl içine kendin eklemen gerekir.

module <xsl:value-of select="@name" /> {
	<xsl:for-each select="struct">struct <xsl:value-of select="@name" /> {
		<xsl:for-each select="*"><xsl:value-of select="local-name()"/><xsl:text> </xsl:text><xsl:value-of select="node()"/>;
		</xsl:for-each>
	};</xsl:for-each>
};


gibi..


Yani örnekteki string,long gibi node isimlerini local name ile almışsın.Sonraki node() ne işe yarıyor?Bu şekilde "{","}",";" yazınca direk çıktıda gözükmüyor,alt satıra geçmiyor ayrıca boşluk da bırakmıyor onlardan bahsettim.Siz direk olarak yazmışsınızthinking





Dunyanin tek madalyali sehri KAHRAMANMARAS...
FENERLI OLUNMAZ FENERLI DOGULUR!!!











Yazar
blackout


avatar

Kayıt: 11.12.2008
02.09.2009-14:48 #63230
node() fonksiyonu current() gibi node değerini veriyor. Alt satır ve boşlukların bire bir olması için kodu "pre" html tagi içine almalısın.

<pre>
module <xsl:value-of select="@name" /> {
	<xsl:for-each select="struct">struct <xsl:value-of select="@name" /> {
		<xsl:for-each select="*"><xsl:value-of select="local-name()"/><xsl:text> </xsl:text><xsl:value-of select="node()"/>;
		</xsl:for-each>
	};</xsl:for-each>
};
</pre>



Bir de <xsl:text> </xsl:text> kısmına dikkatini çekerim; normalde boşluklar (pre tagi içinde) bire bir görüntülenir fakat iki xpath verisi arasındaki boşluklar ekranda görünmüyor. Plain text çıktılar için xsl:text taginin kullanılması yararlıdır.





Yazar
nightfall


avatar
Kahramanmaras
Kayıt: 18.11.2007
02.09.2009-16:10 #63236
blackout yazdi
 
node() fonksiyonu current() gibi node değerini veriyor. Alt satır ve boşlukların bire bir olması için kodu "pre" html tagi içine almalısın.

<pre>
module <xsl:value-of select="@name" /> {
	<xsl:for-each select="struct">struct <xsl:value-of select="@name" /> {
		<xsl:for-each select="*"><xsl:value-of select="local-name()"/><xsl:text> </xsl:text><xsl:value-of select="node()"/>;
		</xsl:for-each>
	};</xsl:for-each>
};
</pre>



Bir de <xsl:text> </xsl:text> kısmına dikkatini çekerim; normalde boşluklar (pre tagi içinde) bire bir görüntülenir fakat iki xpath verisi arasındaki boşluklar ekranda görünmüyor. Plain text çıktılar için xsl:text taginin kullanılması yararlıdır.


peki kodda kök düğümleri ve alt düğümleri eşleştirmek için template match kullanmamız gerekmiyor mu?Ben Altova XMLSpy diye bir programda yazıyorum ama hata veriyorworried





Dunyanin tek madalyali sehri KAHRAMANMARAS...
FENERLI OLUNMAZ FENERLI DOGULUR!!!











Yazar
blackout


avatar

Kayıt: 11.12.2008
02.09.2009-16:19 #63237
Elbette gerekiyor. Ben senin kodunun tamamını bilmediğim için parça örnek vermiştim.
Yapmak istediğin tam böyle bir şey mi bilmiyorum ama şu örneği inceleyebilirsin:

test.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<modules>
	<module name="Demo">
		<struct name="DemoTopic">
			<string>from</string>
			<string>subject</string>
			<long>id</long>
		</struct>
	</module>
	<module name="Demo2">
		<struct name="DemoTopic">
			<string>from2</string>
			<string>subject2</string>
			<long>id2</long>
		</struct>
	</module>
</modules>


test.xls
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<pre>
<xsl:for-each select="modules/module">
module <xsl:value-of select="@name" /> {
	<xsl:for-each select="struct">struct <xsl:value-of select="@name" /> {
		<xsl:for-each select="*"><xsl:value-of select="local-name()"/><xsl:text> </xsl:text><xsl:value-of select="node()"/>;
		</xsl:for-each>
	};</xsl:for-each>
};
</xsl:for-each>
</pre>
</body>
</html>
</xsl:template>
</xsl:stylesheet>






Yazar
nightfall


avatar
Kahramanmaras
Kayıt: 18.11.2007
02.09.2009-16:24 #63238
evet bunun gibi birşey,ama burda xsl htmlye çeviriyor.Onun için html tagleri geçerli,ben text hale dönüştürmek istiyorum bu durumda da geçerli mi_?





Dunyanin tek madalyali sehri KAHRAMANMARAS...
FENERLI OLUNMAZ FENERLI DOGULUR!!!











Yazar
blackout


avatar

Kayıt: 11.12.2008
02.09.2009-16:34 #63239
nightfall yazdi
 
evet bunun gibi birşey,ama burda xsl htmlye çeviriyor.Onun için html tagleri geçerli,ben text hale dönüştürmek istiyorum bu durumda da geçerli mi_?

Sadece düz metin gibi yazıp templatin üstüne <xsl:output method="text" indent="yes"/> kodunu eklemen gerekir.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="modules/module">
module <xsl:value-of select="@name" /> {
	<xsl:for-each select="struct">struct <xsl:value-of select="@name" /> {
		<xsl:for-each select="*"><xsl:value-of select="local-name()"/><xsl:text> </xsl:text><xsl:value-of select="node()"/>;
		</xsl:for-each>
	};</xsl:for-each>
};
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>






Yazar
nightfall


avatar
Kahramanmaras
Kayıt: 18.11.2007
02.09.2009-16:40 #63240
blackout yazdi
 
nightfall yazdi
 
evet bunun gibi birşey,ama burda xsl htmlye çeviriyor.Onun için html tagleri geçerli,ben text hale dönüştürmek istiyorum bu durumda da geçerli mi_?

Sadece düz metin gibi yazıp templatin üstüne <xsl:output method="text" indent="yes"/> kodunu eklemen gerekir.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="modules/module">
module <xsl:value-of select="@name" /> {
	<xsl:for-each select="struct">struct <xsl:value-of select="@name" /> {
		<xsl:for-each select="*"><xsl:value-of select="local-name()"/><xsl:text> </xsl:text><xsl:value-of select="node()"/>;
		</xsl:for-each>
	};</xsl:for-each>
};
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


evet o satır ekli zaten son çalıştırdığımda kod hata vermiyor ama çıktı da vermiyor.Çıktı sayfasında "Invalid at the top level of the document" yazısı çıkıyor altta da yan yana fromsubjectid yazıyor off offcrying





Dunyanin tek madalyali sehri KAHRAMANMARAS...
FENERLI OLUNMAZ FENERLI DOGULUR!!!











Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb