Avatar billede malm Nybegynder
30. oktober 2001 - 19:58 Der er 2 kommentarer og
1 løsning

XPath problem

Jeg har et problem med at få XPath til at udvælge nogle bestemte noder.

I følgende eksemple ønsker jeg at vise noden List men kun for children til noden PEUGEOT. Desværre får jeg for meget med idet alle efterfølgende noder vises.

Ved brug af xsl:template match=\"PEUGEOT\"> havde jeg egenligt forventet kun at udvælge children til denne match også selvom jeg længere nede anvender <xsl:value-of select=\".\"/>

Yderligere point kan måske komme på tale til den af jer, der samtidig kan give et hint til, hvordan opgaven løses ved brug af Whitehill <Xsl> Composer. (se http://www.whitehill.com/Products/xslcomposer/)

XSL:

<?xml version=\"1.0\"?>
<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">
<xsl:template match=\"/\">
  <html>
  <xsl:apply-templates/>   
  </html>
</xsl:template>

<xsl:template match=\"PEUGEOT\">
 
  <p>
  <b>
    <xsl:value-of select=\"Name\"/>
  </b>
  </p>
 
  <xsl:for-each select=\"List\">
 
  <p>
    <xsl:value-of select=\".\"/>
  </p>
 
  </xsl:for-each>

</xsl:template>

</xsl:stylesheet>

XML:

<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>
<template>
  <References>
<PEUGEOT>
    <Name>Peugeot 406</Name>
  <List>406 Sedan</List>
  <List>406 St. car</List>
  <List>406 Coupé</List>
</PEUGEOT>
<PEUGEOT>
  <Name>Peugeot 306</Name>
  <List>Peugeot 306 Sedan</List>
  <List>Peugeot 306 St. car</List>
</PEUGEOT>
<BMW>
  <Name>BMW 3-Serie</Name>
  <List>Cabriolet</List>
  <List>Compact</List>
  <List>Coupé</List>
  <List>Sedan</List>
</BMW>
  </References>
</template>

HTML output genereret gennem Saxon:



Peugeot 406

406 Sedan

406 St. car

406 Coupé

Peugeot 306

Peugeot 306 Sedan

Peugeot 306 St. car

BMW 3-Serie Cabriolet Compact Coupé Sedan !!!

Sidste linie vil jeg meget gerne være foruden!


Med venlig hilsen
Henrik Malmvig
Avatar billede ehf Nybegynder
30. oktober 2001 - 20:41 #1
Hej Henrik

I xslt er der pr default en \"usynlig\" template som matcher det du ikke selv matcher. Denne outputter det den matcher.

For at undgå/fjerne tekst du ikke vil have skal du lave følgende template.

<xsl:template match=\"text()\" />

Denne fanger alt det du ikke selv fanger og dirigerer det ud i ingenting.

/Ehf
Avatar billede perhoyer Nybegynder
31. oktober 2001 - 00:36 #2
Hej Henrik.
Det ser ud til at din kode skal virke i en browser clientside ??
I givet fald er dit XSL Namespace galt
http://www.w3.org/1999/XSL/Transform\" er fed til serveren hvor man beder den ægte MSXML om at arbejde for sig. men MSXML er ikke 100 kompetibel med browseren (end ikke i 5.5)
Prøv at ændre namespacet til:
http://www.w3.org/TR/WD-xsl
That should do the trick.
Avatar billede malm Nybegynder
31. oktober 2001 - 11:17 #3
Hej Per

http://www.w3.org/TR/WD-xsl giver følgende fejlmeddelse i Saxon:

Saxon i not able to process Microsoft\'s WD-xsl dialect.

Du havde nok regnet med at jeg brugte Explorers indbyggede parser. Jeg have ellers skrevet at jeg brugte Saxon til at generere HTML :)

Ehf svar derimod hjalp mig videre og udvidede min viden inden for XSLT. Derfor få ehf 30 point.

Jeg takker jer begge for et hurtigt svar.

Med venlig hilsen
Henrik Malmvig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester