Avatar billede Slettet bruger
29. april 2005 - 16:28 Der er 8 kommentarer og
1 løsning

negate selection i apply templates

Hej eksperter,

jeg har med stor success kunne bruge apply-templates til at "apply" templates på specifikke xml-elementer, som følger

<xsl:apply-templates match="." select="paragraph[@name = 'intro']" />
<xsl:apply-templates match="." select="paragraph[@name = 'outro']" />

men nu vil jeg så ha fat i alle de notes der ikke er paragraph-nodes med attributterne intro og outro. altså <ost></ost>, <paragraph ost="godt"></paragraph> skal være gyldige resultater...

men det kan jeg sq' ikke få den til.

har allerede prøvet med:

<xsl:apply-templates match="." select="not(paragraph[@name = 'intro']) or not(paragraph[@name = 'outro'])" />

men det virker ikke...

Så nu trygler jeg jer vise folk om hjælp....

På forhånd tak, Anders
Avatar billede Slettet bruger
29. april 2005 - 17:56 #1
Okay, jeg kom så lidt videre...

<xsl:apply-templates select="*[name() != 'paragraph']" />

er en del af vejen, nu har jeg fjernet alle paragraph elementer, men prøver jeg at fjerne alle paragraph elementer, med attributten name sat til 'intro' går det galt:

<xsl:apply-templates select="*[name() != 'paragraph' and @name != 'intro']" />

...men det virker ikke efter hensigten, giver ikke noget som resultat *suk*...

Kom glad... hjælp mig, please :-|
Avatar billede janegil Nybegynder
29. april 2005 - 19:57 #2
XSLT blir som regel vakrere med select i template, heller enn i apply-templates.

Prosa er dessverre  mindre presist enn XSLT, så fortell oss:
Skal <paragraph name="intro"/> med?
<something-else name="intro"/> ?
<paragraph name="else"/> ?
<something-else name="else"/>?

Fire spørsmål som krever 4 ja/nei svar.
Avatar billede Slettet bruger
30. april 2005 - 00:09 #3
For mig at se griber du det lidt forkert/omvendt an.

Når der er elementer jeg IKKE vil have med i output, laver jeg en tom template hertil, f.eks.:

<xsl:template match="paragraph" />

Dvs. hvis du IKKE vil have paragraph elementer hvor attributten "name" er "intro", kan du f.eks. gøre sådan:

<xsl:template match="paragraph[@name = 'intro']" />

Derved kan man som regel klare sig med simple templates, der bare vha. <xsl:apply-templates /> delegerer videre til mere specifikke.

/CS
Avatar billede Slettet bruger
02. maj 2005 - 15:00 #4
@janegil:

<paragraph name="intro"/>      skal IKKE med
<something-else name="intro"/> SKAL med
<paragraph name="else"/>      SKAL med
<something-else name="else"/>? SKAL med

<paragraph name="outro"/>      skal IKKE med (det var lige en ekstra en)
Avatar billede Slettet bruger
02. maj 2005 - 15:05 #5
@greystate:

men jeg VIL rent faktisk godt ha' dem med i outputtet, bare ikke lige på det omtalte sted hvor jeg vil ha' alt output pånær de 2 paragraph-elementer. Jeg bruger selv fremgangsmåden med "tomme templates" til at "undertrykke" output fra "uønskede" elementer.
Avatar billede janegil Nybegynder
02. maj 2005 - 16:15 #6
Jeg har aldri riktig sett nytten i mode-attributtet, http://www.w3.org/TR/xslt#section-Applying-Template-Rules men det kunne være det kan brukes her?
Avatar billede Slettet bruger
03. maj 2005 - 09:12 #7
Jeg synes ikke mode-attributten hjælper mig, kan det virkeligt passe at man ikke kan apply-templates på alle andre elementer end:

<paragraph name="intro"></paragraph> og <paragraph name="outro"></paragraph>

?
Avatar billede Slettet bruger
04. maj 2005 - 00:11 #8
Okey-dokey - det du vil kan gøres med denne her:

<xsl:apply-templates select="paragraph[not(@name = 'intro')][not(@name = 'outro')]" />

/CS
Avatar billede Slettet bruger
19. maj 2005 - 16:34 #9
Takker for svaret :-)
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