webForumDet fria alternativet

nytt xml-dokument från ett gammalt xml-dokument

XML

1 svar · 729 visningar · startad av PollyJuice

Medlem sedan mars 2006124 inlägg
Frågan#1

Hej,

jag har kört fast på en uppgift och skulle behöva lite tips om hur jag ska gå till väga för att lösa den.

Jag har ett xml-dokument som, lite kortfattat, ser ut såhär:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="uppgift9_2.xsl"?>

<autoads>
	<ad>
		<type>1</type>
		<name>Honda</name>
		<model>XL 1000 V</model>
		<regyear>2001</regyear>
		<price>129900</price>
		<adtext>
		2001 Honda XL 1000 V, 8.900 km. Hög vindruta. Pris 129.900kr,-.
		</adtext>
		<addate>20020115</addate>
		<volume>1000</volume>
		<category/>
	</ad>
</autoads>

Uppgiften är att mha XSLT transformera detta till ett nytt XML-dokument som ser ut såhär:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="uppgift9_2.xsl"?>
<motorpark>
<fordon pris="129900">
<namn>Honda</namn>
<modellTyp1>XL 1000 V</modellTyp1>
</fordon>
</motorpark>

Det nya XML-dokumentet ska bestå av ett rotelement med namnet motorpark. Rotelementet kan ha flera element med namnet fordon, vilka innehåller information om var och en av bilarna/motorcyklarna i XML-dokumentet. Observera att elementet PRICE i första dokumentet ska omvandlas till ett attribut till FORDON i andra dokumentet, och det ska skapas ett helt nytt element med namnet modellTypX (från elementen model och type).

Jag testade att skriva såhär i XSLT-dokumentet:

<?xml version="1.0" encoding="ISO-8859-1"?><!-- DWXMLSource="uppgift9_1.xml" -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<motorpark>
<xsl:apply-templates select="autoads" mode="ad"/>
</motorpark>
</xsl:template>

<fordon>
<xsl:template match="ad/price" mode="copy">
<xsl:copy> 

<xsl:apply-templates select="ad/price" mode="copy"/>
<xsl:apply-templates mode="copy"/>
</xsl:copy>
</xsl:template>
	<namn></namn>

<xsl:template match="ad/type" mode="copy">
<xsl:copy> 
<modellTyp>
<xsl:apply-templates select="ad/type" mode="copy"/>
<xsl:apply-templates mode="copy"/>
</modellTyp>
</xsl:copy>
</xsl:template>
</fordon>
</xsl:stylesheet>

men det är uppenbart att något är fel. Kan någon tipsa mig om var jag tänkt fel och hur jag ska göra för att skapa det nya xml-dokumentet som det ska se ut?

Medlem sedan juli 20013 378 inlägg
#2

Hmm...

Några tips...

<xsl:template match="/">

matchar autoads - din apply-templates kommer inte att hitta något.

<fordon>
<xsl:template match="ad/price" mode="copy">

Ordningen på dessa är knas (fundera över vilken mall som skall generera <fordon> - det är ett "template" och inte "stylesheet" eftersom du skall kunna hantera flera ;)
... och om det inte explicit ingår i uppgiften, behöver du inte komplicera saker och ting med mode-attribut ;)

<xsl:template match="ad/price" mode="copy">

Hmm...
xsl:element, xsl:attribute och xsl:value-of är bra att ha när man vill omforma elementstruktuer ;)

Lycka till med uppgiften :bire

257 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)