Toon posts:

[xsl] denkertje, kom er zelf niet uit iig

Pagina: 1
Acties:

Verwijderd

Topicstarter
ok, ik heb de volgende versimpliceerde xml-constructie:
code:
1
2
3
4
5
6
7
8
<fieldgroup label="veldjes">
  <field type="text" label="naam"></field>
  <field type="textare" label="bio"></field>
  <field type="dropdown" label="sex"></field>
</fieldgroup>
<field type="text" label="naam"></field>
<field type="textarea" label="bio"></field>
<field type="dropdown" label="sex"></field>

dit zou omgevormd moeten worden naar de volgende (versimpliceerde) html-syntax:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<td>veldjes</td>
<td>
  naam <input/>
  bio <textarea/>
  sex <select/>
</td>
<td>naam</td>
<td>
  <input/>
</td>
<td>bio</td>
<td>
  <textarea/>
</td>
<td>sex</td>
<td>
  <select/>
</td>

hoe zet ik m'n xsl-syntax nou zo in elkaar dat ik niet 2 verschillende templates voor elk type field nodig heb (1 zonder kolommetjes eromheen en 1 met kolommetjes eromheen)

nu heb ik namelijk dit (ook versimpliceerd):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<xsl:template match="fieldgroup">
  <xsl:call-template name="columns"/>
</xsl:template>

<xsl:template name="columns">
  <td><xsl:value-of select="label"/></td><td><xsl:apply-templates/></td>
</xsl:template>

<xsl:template match="field[@type='text']">
  <input/>
</xsl:template>

<xsl:template match="field[@type='textarea']">
  <textarea/>
</xsl:template>

<xsl:template match="field[@type='dropdown']">
  <select/>
</xsl:template>

voor velden binnen een fieldgroup werkt dit prima... maar hoe zet ik m'n xsl-syntax nou in elkaar dat velden die niet in een fieldgroup vallen wel in een kolommetje worden gezet?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ah, je wilt dus onder bepaalde voorwaarden extra content om de content die de template nu oplevert? Dit kan je niet in de template zetten omdat je dan ook de andere output beinvloed en je wilt ook niet twee templates voor hetzelfde?

Ik denk echter dat in dit geval er geen andere oplossing is dan om toch meerdere templates te maken: je wilt namelijk ook nog extra content in de content die de meeste primitieve vorm oplevert...

Voorbeeld. Je wilt dit:
code:
1
  naam <input/>

maar ook dit:
code:
1
2
3
4
<td>naam</td>
<td>
  <input/>
</td>

Je ziet hier dat de content van het eerste wat je wilt niet alleen is 'ingepakt' maar ook nog intern is verandert. Dat gaat dus nooit lukken :) .

Conclusie: maak gewoon meerdere templates en zorg dat de match fields in fieldgroups scheidt van losse fields. Probeer generieke onderdelen eventueel op te vangen met named-templates...Je code wordt zo ook veel duidelijker: als je in twee verschillende situaties ziet moet je die niet op een obscure manier als dezelfde situatie gaan behandelen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
is het niet mogelijk om een variabele template aan te spreken?

zoiets als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
  <xsl:template match="field">
    <xsl:variable name="fieldtype" select="@type"/>
    <xsl:choose>
    <xsl:when test="../fieldGroup">
      <b><xsl:value-of select="@label"/></b> <xsl:call-template name="$fieldtype"/>
    </xsl:when>
    <xsl:otherwise>
      <td><xsl:value-of select="@label"/></td>
      <td><xsl:call-template name="$fieldtype"/></td>
    </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Haha :) . Ik heb geen idee eigenlijk. Probeer het uit :) .

Maar je kunt toch ook gewoon matchen op het type :? Desnoods ga je over in een andere mode als dat conflicteerd met andere templates.

Maar goed, je maakt hier gevalsonderscheid in 1 template. Het is natuurlijk sterk de vraag of dat fraai is: dit onderscheid kan je ook maken door 2 templates te maken en de match-expressie het onderscheid te laten maken.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
maar dit maakt mijn stylesheet wel substantieel groter, snapshot:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<xsl:template match="field[@type='text']">
    <xsl:element name="input">
    <xsl:attribute name="type">text</xsl:attribute>
    <xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
    <xsl:if test="@maxlength">
      <xsl:attribute name="maxlength"><xsl:value-of select="@maxlength"/></xsl:attribute>
    </xsl:if>
    <xsl:if test="@size">
      <xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute>
    </xsl:if>
    <xsl:call-template name="standardAttributes"/>
    <xsl:call-template name="formFieldEventAttributes"/>
    <xsl:call-template name="optionalFieldAttributes"/>
    </xsl:element>
  </xsl:template>
  
  <xsl:template match="field[@type='secret']">
    <xsl:element name="input">
    <xsl:attribute name="type">password</xsl:attribute>
    <xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
    <xsl:if test="@maxlength">
      <xsl:attribute name="maxlength"><xsl:value-of select="@maxlength"/></xsl:attribute>
    </xsl:if>
    <xsl:if test="@size">
      <xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute>
    </xsl:if>
    <xsl:call-template name="standardAttributes"/>
    <xsl:call-template name="formFieldEventAttributes"/>
    <xsl:call-template name="optionalFieldAttributes"/>
    </xsl:element>
  </xsl:template>
  
  <xsl:template match="field[@type='hidden']">
    <xsl:element name="input">
    <xsl:attribute name="type">hidden</xsl:attribute>
    <xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
    <xsl:call-template name="standardAttributes"/>
    <xsl:call-template name="formFieldEventAttributes"/>
    <xsl:call-template name="optionalFieldAttributes"/>
    </xsl:element>
  </xsl:template>
  
  <xsl:template match="field[@type='upload']">
    <xsl:element name="input">
    <xsl:attribute name="type">file</xsl:attribute>
    <xsl:call-template name="standardAttributes"/>
    <xsl:call-template name="formFieldEventAttributes"/>
    <xsl:call-template name="optionalFieldAttributes"/>
    </xsl:element>
  </xsl:template>
  
  <xsl:template match="field[@type='checkbox']">
    <xsl:element name="input">
    <xsl:attribute name="type">checkbox</xsl:attribute>
    <xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
    <xsl:call-template name="standardAttributes"/>
    <xsl:call-template name="formFieldEventAttributes"/>
    <xsl:call-template name="optionalFieldAttributes"/>
    <xsl:if test="@checked='true'">
      <xsl:attribute name="checked">true</xsl:attribute>
    </xsl:if>
    </xsl:element>
  </xsl:template>
  
  <xsl:template match="field[@type='radio']">
    <xsl:element name="input">
    <xsl:attribute name="type">radio</xsl:attribute>
    <xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
    <xsl:call-template name="standardAttributes"/>
    <xsl:call-template name="formFieldEventAttributes"/>
    <xsl:call-template name="optionalFieldAttributes"/>
    <xsl:if test="@checked='true'">
      <xsl:attribute name="checked">true</xsl:attribute>
    </xsl:if>
    </xsl:element>
  </xsl:template>
  
  <xsl:template match="field[@type='textarea']">
    <xsl:element name="textarea">
    <xsl:attribute name="rows"><xsl:value-of select="@rows"/></xsl:attribute>
    <xsl:attribute name="cols"><xsl:value-of select="@cols"/></xsl:attribute>
    <xsl:call-template name="standardAttributes"/>
    <xsl:call-template name="formFieldEventAttributes"/>
    <xsl:call-template name="optionalFieldAttributes"/>
    <xsl:value-of select="@value"/>
    </xsl:element>
  </xsl:template>

verdubbel dat maar eens...

het werkte niet trouwens, pagina kwam blank terug, blijkbaar wordt een variabele alleen binnen een select geparsed.

Verwijderd

Probeer dit eens:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<xsl:template match="fieldgroup">
  <td><xsl:value-of select="label"/></td>
  <td><xsl:apply-templates select="*" mode="column"/></td>
</xsl:template>

<xsl:template match="field" mode="column">
  <xsl:value-of select="@label"/> <xsl:apply-templates select="." mode="element">
</xsl:template>

<xsl:template match="field[@type='text']" mode="element">
  <input/>
</xsl:template>

<xsl:template match="field[@type='textarea']" mode="element">
  <textarea/>
</xsl:template>

<xsl:template match="field[@type='dropdown']" mode="element">
  <select/>
</xsl:template>

<xsl:template match="field">
  <td>
    <xsl:apply-templates select="." mode="element">
  </td>
</xsl:template>

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ho ho, maar ik zei ook niet dat je je stylesheets moest laten exploderen ;) .

Je kunt dit veel generieker maken. Eventueel moet je daarbij eens denken aan een externe config file waarin je alles wat niet generiek is oplost.

Ik kan zo wel ff een voorbeeld maken als je niet begrijpt waar ik op doel...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Op donderdag 10 januari 2002 15:36 schreef mbravenboer het volgende:
Ik kan zo wel ff een voorbeeld maken als je niet begrijpt waar ik op doel...
plz :)

ik heb nu het volgende bedacht, maar dat zorgt er nog steeds voor dat ik veel extra code moet toevoegen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  <xsl:template match="field[@type='text']">
    <xsl:variable name="fieldtype" select="@type"/>
    <xsl:choose>
    <xsl:when test="name(..)='fieldGroup'">
      <b><xsl:value-of select="@label"/></b> <xsl:call-template name="text"/>
    </xsl:when>
    <xsl:otherwise>
      <td><xsl:value-of select="@label"/></td>
      <td><xsl:call-template name="text"/></td>
    </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="field[@type='secret']">
    <xsl:variable name="fieldtype" select="@type"/>
    <xsl:choose>
    <xsl:when test="name(..)='fieldGroup'">
      <b><xsl:value-of select="@label"/></b> <xsl:call-template name="secret"/>
    </xsl:when>
    <xsl:otherwise>
      <td><xsl:value-of select="@label"/></td>
      <td><xsl:call-template name="secret"/></td>
    </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

en dat voor elk type veld. Ben er nog niet uit hoe ik dit generieker kan aanpakken

Verwijderd

Topicstarter
Dit zou imo het mooiste zijn (vereist maar 1 xtra template):
code:
1
2
3
4
5
6
7
8
9
10
11
12
  <xsl:template match="field">
    <xsl:variable name="fieldtype" select="@type"/>
    <xsl:choose>
    <xsl:when test="../fieldGroup">
      <b><xsl:value-of select="@label"/></b> <xsl:call-template name="$fieldtype"/>
    </xsl:when>
    <xsl:otherwise>
      <td><xsl:value-of select="@label"/></td>
      <td><xsl:call-template name="$fieldtype"/></td>
    </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

maar helaas werkt het niet

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hier is een idee. Ik wilde eerst met een externe config file werken, maar omdat sommige dingen wel vrij specifieke waren ging dat niet zo goed.

Ik heb nu dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>

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

    <xsl:output method="xml" encoding="UTF-8"/>
   
    <xsl:template match="field">
      <input value="{@value}">
        <xsl:apply-templates select="current()" mode="specific"/>
      </input>
    </xsl:template>

    <xsl:template match="field[@type = 'secret']" mode="specific">
    <xsl:attribute name="type">password</xsl:attribute>
    </xsl:template>

    <xsl:template match="field[@type = 'text']"  mode="specific">
    <xsl:attribute name="type">text</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

Wat kun je hiermee? Generieke dingen doe je in de eerste template. Daarna roep je hem opnieuw aan met een andere mode voor specifieke zaken . Werkt perfect :) .

Misschien is het wel verstandig om met meer modes te werken omdat je eigenlijk twee families hebt: tekstvelden en van die checkboxen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
koel! Dit werkt idd perfect!

/me is happy :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Mas*Mind: * mbravenboer is happy :)
Dan is * mbravenboer ook happy ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1