webForumDet fria alternativet

Svg -> Xslt -> Html

5 svar · 501 visningar · startad av Web-Tor

Web-TorMedlem sedan nov. 200013 890 inlägg
#1

Jag har en SVG-fil som innehåller bl.a. det här:

	<text xml:lang="se">Hej</text>
	<text xml:lang="en">Hello</text>

Nu vill jag ha ut bara den svenska texten så jag läger jag på ett XSLT-stylesheet som bl.a. innehåller det här:

<!-- Start of transformation -->
<!-- ======================= -->

<xsl:template match="/">

	<html>
	<head><title>NULL</title>
	</head>
	<body>

	<xsl:if test="text[@xml:lang='se']">
		<xsl:call-template name="se"/>
	</xsl:if>

	<hr/>
	<div>
	<p><em>Slut på dokumentet</em></p>
	</div>
	</body>
	</html>

</xsl:template>

<!-- Block-level elements transformation -->
<!-- =================================== -->

<xsl:template name="se">
	<p><xsl:apply-templates/></p>
</xsl:template>

</xsl:stylesheet>

Men det händer ingenting. HTML-filen som jag får ut innehåller bara det här:

 <html xmlns="http://www.w3.org/TR/REC-html40" xmlns:svg="http://www.w3.org/2000/svg">
<head><title>NULL</title>
</head>
<body>
<hr/>
<div>
<p><em>Slut på dokumentet</em></p>
</div>
</body>
</html>

…hjälp :l

jarvkloMedlem sedan juli 20013 378 inlägg
#2

Skulle

<xsl:template match="/svg">
	<html>
	<head><title>NULL</title>
	</head>
	<body>
		<xsl:apply-templates  select="text[@xml:lang='se']"/>
	<hr/>
    <div>
    <p><em>Slut pa dokumentet</em></p>
	</div>
	</body>
	</html>
</xsl:template>

<xsl:template name="text" >
	<p><xsl:value-of select="." /></p>
</xsl:template>

funka för det du vill göra? - eller är det krav på att du skall använda just <xsl:if> och <xsl:call-template > ?

Web-TorMedlem sedan nov. 200013 890 inlägg
#3

Med din kod får jag bara ut texten Hej Hello. Ingen html-kod ens :q

Det är inget krav att använda if eller call-template. Jag vill bara låta bli att skriva ut där xml:lang är satt till 'en'. :x

jarvkloMedlem sedan juli 20013 378 inlägg
#4

Med din kod får jag bara ut texten Hej Hello.

Hmm... Ojdå - då har du problem med att "huvud-regeln" inte lyckas matcha mot rot-elementet i din SVG-fil!

Jag gissade mig till att ditt dokument såg ut nånting i stil med

<svg>
	<text xml:lang="se">Hej</text>
	<text xml:lang="en">Hello</text>
</svg>

- och skrev min mall för att matcha det antagandet (och med *det* porovdatat funkar mallen i XMLCooktop med MSXML3 sp2 ;)

Kan du bifoga en delmängd av din SVG-fil som är komplett med rotelement m.m.?

Web-TorMedlem sedan nov. 200013 890 inlägg
#5

Jag är ganska ny på XML/XSLT så jag är tacksam för all hjälp jag kan få.

Jag du lösa detta åt mig så blir jag överlycklig:
Från SVG filen (som innehåller orden "hej" och "hello") ska endast "hej" skrivas ut.

Här är mina filer.

jarvkloMedlem sedan juli 20013 378 inlägg
#6

Hmmm...
Intrikat på min ära ;)
Det du verkar ha snubblat över vad som krävs för att använda multipla namespaces i xslt-mallar !

Det som verkar vara ditt problem är:

  1. Du deklarerar din svg-fil till att tillhöra ett visst xml-namespace
    (ur din SVG-fil:
<svg ... xmlns="http://www.w3.org/2000/svg">

) - Detta kommer du antagligen inte undan (har inte kollat in SVG-specen i detalj, men misstänker att du *måste* ha xmlns="..." i <svg> på det sättet om du vill uppfylla standarden "strikt" ;) )

  1. samtidigt deklarerar du att det namespacet skall bindas till prefixet "svg" i XSLT-filen
    ( ur din XSLT-fil:
<xsl:stylesheet ... xmlns:svg="http://www.w3.org/2000/svg" ...>

)

Tillsammans verkar dessa deklarationer medföra att alla svg-taggar du vill hämta information ur i din XSLT-mall måste skrivas med "svg:" som prefix i mallen! (t.ex. svg som svg:svg, text som svg:text osv)

Gör man så, så löser det iaf problemet

 <?xml version="1.0" standalone="no"?>
<xsl:stylesheet
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:svg="http://www.w3.org/2000/svg"
	version="1.0"
>
<xsl:output method="html"/>
<xsl:template match="/svg:svg">
	<html>
	<head><title>NULL</title>
	</head>
	<body>
		<xsl:apply-templates  select="svg:text[@xml:lang='se']"/>
	<hr/>
    <div>
    <p><em>Slut pa dokumentet</em></p>
	</div>
	</body>
	</html>
</xsl:template>

<xsl:template name="svg:text" >
	<p><xsl:value-of select="." /></p>
</xsl:template>
</xsl:stylesheet>

Om du orkar sätta dig in i alla detaljer i ämnet, så finns XML Namespaces på http://www.w3.org/TR/1999/REC-xml-names-19990114/ - fast den är ganska svårsmält :bire

142 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)