PDA

View Full Version : XSLT


Stijn
18-05-2007, 23:08
Iemand met wat kennis van XSLT? Ik probeer iets eenvoudigs aan de gang te krijgen maar het loopt meteen al mis:

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


<xsl:template match="h1">
</xsl:template>

</xsl:stylesheet>

Dit wil (in combinatie met een XML weliswaar) niks outputten, terwijl het perfect lukt als ik match op "/" (op alles dus). De h1 tags zitten zowat verspreid over het document en op verschillende dieptes, maar ik meende dat die match ze er gewoon uitpikte - nee dus? Andere ideeŽn?

Dank.

Random
18-05-2007, 23:38
Tijdje geleden dat ik met XSLT geknoeid heb, maar als ik me niet vergis:

<xsl:template match="//h1">
</xsl:template>

WiM
19-05-2007, 01:53
Mijn kennis over XSLT is klein maar ik doe het steeds op de volgende manier:


<xsl:template match="/">
<xsl:apply-templates select="h1"/>
</xsl:template>

<xsl:template match="h1">
...
</xsl:template>


Random zijn oplossing zal waarschijnlijk ook juist zijn aangezien je de 'root' van het xml document nog moet meegeven, maar dat kan ook compleet gibberish zijn :-).

Stijn
19-05-2007, 18:50
Geen van beide zaken werkte precies, hoewel ik nu begin te twijfelen of het niet aan de parser of iets dergelijks ligt. Soit, ik heb het voorlopig op een andere manier opgelost en zal tijdens de vakantie nog wel wat prutsen. Alleszins zeer handig die XSLT... als het werkt :)

ran
21-05-2007, 13:19
Zonder templates enzo (hey, heb enkel nog maar xslt gebruikt omdat ik het snel effe nodig had, niet om iets serieus mee te doen)


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="//h1">
<xsl:value-of select=text()></xsl:value-of>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

is waarschijnlijk niet helemaal juist, maar je kan ermee vertrekken...

spacid
21-05-2007, 19:40
Moet er normaal geen html in uw xslt zitten dus iets zoals in de trend van

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>iets</title>
</head>
<body>
<xsl:apply-templates select="h1" />
</body>
</html>
</xsl:template>

<xsl:template match="h1" />

</xsl:stylesheet>

Klopt de xpath locatie naar h1? Geef xml ook eens want ik vermoed dat het daar fout zit.

XML is toch iets in de trend van:

<studentenlijst xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<student nummer="1258">
<naam>Kenneth Vermeirsch</naam>
<leeftijd>26</leeftijd>
<lengte>187</lengte>
<geslacht>M</geslacht>
</student>
</studentenlijst>


en dan met xslt bv.
<h1><xsl:value-of select="naam" /></h1> in combinatie met juiste template, for each en xpath expressie.

Stijn
22-05-2007, 10:03
Ik zal het vanavond nog eens proberen. Die <html> is alleszins niet nodig gezien ik gewoon van xml naar xml wil gaan. En die xml is wel degelijk valide hoor :) De XPath locatie naar de h1's opgeven is nogal moeilijk natuurlijk gezien ze (zoals gezegd) verspreid staan over de gehele xml en op verschillende diepte.

Alle h1's er uithalen is me reeds gelukt met een for-each, maar wat ik nodig heb is eigenlijk een soort van find-and-replace: op basis van het parent div-element moet de h1 veranderen in een h2, h3, etc.

ran
22-05-2007, 11:13
Ik zal het vanavond nog eens proberen. Die <html> is alleszins niet nodig gezien ik gewoon van xml naar xml wil gaan. En die xml is wel degelijk valide hoor :) De XPath locatie naar de h1's opgeven is nogal moeilijk natuurlijk gezien ze (zoals gezegd) verspreid staan over de gehele xml en op verschillende diepte.

Alle h1's er uithalen is me reeds gelukt met een for-each, maar wat ik nodig heb is eigenlijk een soort van find-and-replace: op basis van het parent div-element moet de h1 veranderen in een h2, h3, etc.post je code eens... Ik heb gisteren even geprobeerd en het wou maar niet lukken :-)

Om te replacen met een h2, h3 moet je je html document opnieuw opbouwen...

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlnssl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="//h1">
<h2>
<xsl:value-of select="text()"></xsl:value-of>
</h2>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>