Avatar billede wired Nybegynder
23. oktober 2003 - 15:14 Der er 15 kommentarer og
1 løsning

Build-in template

Har nu længe siddet fast med dette - sandsynligvis -begynder problem. Og sikkert en grundlæggende manglende viden om build-in templates.

Hvorfor udskrives
"Head 2 Subject 1 subject 2" i boksen Head 1
Ønskes var kun at få "subject 2" ud

Ka' nogen hjælpe....

a.xml
=====
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="a.xslt"?>
<data>
  <link>
    <headline>Head 1</headline>
    <subject>

      <link>
        <headline>Head 2</headline>
        <subject>
          Subject 1
        </subject>
      </link>

      subject 2
    </subject>
  </link>

  <link>
    <headline>Head 3 </headline>
    <subject>Subject 3</subject>
  </link>
  <link>
    <headline>Head 4</headline>
    <subject>Subject 4</subject>
</link>
</data>

a.xslt
======
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
  <html>
    <body>
            <xsl:apply-templates select="data" />
    </body>
  </html>
    </xsl:template>

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

  <xsl:template match="link">
        <div style="border: 1px solid;position:relative;left:10;">
          <xsl:apply-templates select="headline"></xsl:apply-templates>
            <xsl:apply-templates select="subject"></xsl:apply-templates>
      </div><br />
  </xsl:template>

    <xsl:template match="headline">
    <xsl:value-of select="."></xsl:value-of>
    </xsl:template>
   
    <xsl:template match="subject">
    <xsl:apply-templates select="link" />
      <xsl:value-of select="."></xsl:value-of><br />
    </xsl:template>

</xsl:stylesheet>
Avatar billede janegil Nybegynder
23. oktober 2003 - 16:35 #1
Det er vel noe med at du har link på flere nivåer.

Så kanskje

<xsl:template match="data">
                <xsl:apply-templates select="./link" />
</xsl:template>

eller noe?
Avatar billede wired Nybegynder
23. oktober 2003 - 16:54 #2
Nix. Virker ikke.
Avatar billede wired Nybegynder
23. oktober 2003 - 17:18 #3
Formoder det skyldes xslt's build-in template eller også har jeg overset noget ved det rekursive kald.
Avatar billede Slettet bruger
23. oktober 2003 - 19:43 #4
Du kalder jo din "link" template inde i "subject" template'en vha. "apply-templates" - og da "Head2" ligger inde i "subject" kommer det jo ud...

/CS
Avatar billede wired Nybegynder
24. oktober 2003 - 00:24 #5
Okay jeg mangler måske lige forståelsen af eksekveringsforløber.

Jeg for moder at man starter fra XML dokumentet og første gang "processor"'en støder på noget i XML-dokumenter checker den det med XSL dokumentet.

Først støder den på <data> så checker den om det er i XSL-dok. Da det er tilfældet overtager <data>-templaten. Den checker så XML-dokumentet om der er et <link> i sit node-set og hvis det er tilfældet springer den til <link>-templaten. etc...

Eller er jeg på et forkert spor?
Avatar billede wired Nybegynder
24. oktober 2003 - 00:31 #6
Hvis ovenstående gælder skulle det yderste <link> kun vise sit eget subject og ikke også det inderst <link>'s subject.

Der kommer til at stå:
-----------------------------
|Head 1
|  --------------------------
|  |Head 2
|  |Subject 1
|  --------------------------
|Head 2 Subject 1 subject 2
---------------------------------

Jeg ville gerne at der kom til at stå
-----------------------------
|Head 1
|  --------------------------
|  |Head 2
|  |Subject 1
|  --------------------------
|subject 2
---------------------------------
Avatar billede Slettet bruger
24. oktober 2003 - 00:40 #7
XSLT Processoren starter med at finde en template der matcher roden ("/") - hvis den ikke eksisterer, bruger den denne "built-in" template:

<template match="/"><apply-templates /></template>

XSLT processoren udfører ikke andre templates herefter, med mindre man beder den om det (vha. apply-templates).

Hvis du beder om et element der ikke er en template for, bruges igen en indbygget:

<template match="*"><apply-templates /></template>

- hvilket udfører denne:

<template match="text()"><value-of select="." /></template>

Så du er på rette spor :-)

/CS
Avatar billede Slettet bruger
24. oktober 2003 - 00:48 #8
Aaah - nu kan jeg se hvad du vil, og hvorfor det går galt: Problemet er den <xsl:value-of select="." /> du har i "subject" template'en - "value-of" udsender ALLE text-nodes i et element *OG* dettes childnodes - derfor får du det dobbelt ud, da du først eksekverer "link" templaten, og derefter beder om text-indholdet.

/CS
Avatar billede wired Nybegynder
24. oktober 2003 - 00:52 #9
Mange tak greystat - lige hvad jeg søgte.

Men burde alle headlines så ikke blive udskrevt to gang, da jeg i min <link> template apply'er headline og når den står seperat for sig selv?
Avatar billede Slettet bruger
24. oktober 2003 - 00:53 #10
Du kan ændre din subject template til at benytte sig af de indbyggede templates, så dit output bliver som du vil have det:

<xsl:template match="subject">
    <xsl:apply-templates />
    <br />
</xsl:template>

/CS
Avatar billede wired Nybegynder
24. oktober 2003 - 00:57 #11
Genialt greystat, det virkede.

Men hvorfor?

Hvad er det den build-in template gør som jeg ikke selv kan gøre?
Avatar billede Slettet bruger
24. oktober 2003 - 00:58 #12
Mht. headline spørgsmålet: Nej, for dine headlines kalder du selv fra link template'en, og det er kun i "subject" du beder om textnodes, og der får du jo også en ekstra ud - nemlig den eneste "headline" der ligger inde under et "subject" (dvs. "Head 2").

/CS
Avatar billede Slettet bruger
24. oktober 2003 - 01:05 #13
Tænk sådan her: Hvis du ingenting foretager dig (dvs. hvis du ikke laver nogen templates), så får du bare alle textnodes ud (ingen attributter).

Hver gang du har et element som skal formateres anderledes laver du bare en template til det, og sender processoren videre med "apply-templates" - f.eks.:

<!-- Output "para" elementer som "p" tags: -->
<xsl:template match="para">
<p><xsl:apply-templates /></p>
</xsl:template>

/CS
Avatar billede wired Nybegynder
24. oktober 2003 - 01:18 #14
Okay jeg læser og forstår hvad du skriver (hvilket du gør utrolig forståligt), men har svært ved at acceptere at processoren kan skelne af jeg har brugt en template i en anden template og derfor ikke skal bruge samme template længere nede / senere.
Jeg er måske nok - for vant til at programmere sekvensielt.
Avatar billede Slettet bruger
24. oktober 2003 - 01:19 #15
Hehe - ja det tager lige lidt tid at vænne sig til :-)

/CS
Avatar billede wired Nybegynder
24. oktober 2003 - 01:32 #16
Mange tak for hjælpen.

Er der andre af samme underlige indfaldsvinkler som man skal være opmærksom på i forbindelse med xslt eller er resten logisk som sekvensielt programmering?
(det virker umiddelbart sådan)
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