[XSL] Variabele attribuut name en for-each voor attributen?*

Pagina: 1
Acties:
  • 155 views sinds 30-01-2008
  • Reageer

  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Ik heb twee brandende vragen waar ik echt niet uitkom. Ik heb op diverse fora gezocht en mijn XML Bible doorgespit, maar ik vind geen oplossing...waarschijnlijk omdat ik door mijn onervarenheid niet weet waar ik op moet zoeken.

Wat is het geval:

Ik heb een bron XML bestand met daarin meerdere <FIELD> elementen. Bij het <FIELD> element hoort een attribuut met naam ID en een waarde. Onder het <FIELD> element bestaat nog een <VALUE> element.

In de doel XML moet een <ROW> element komen met attributen. Er moeten in feite net zoveel attributen komen als dat er <FIELD> elementen zijn. De naam van elk attribuut moet gelijk zijn aan de waarde van het ID attribuut dat hoort bij het <FIELD> element. De waarde van elk attribuut moet gelijk zijn aan de waarde van het <VALUE> element.

Als ik een vaste attribuut name opgeef, werkt het, al geeft ie dan enkel de waarde van het laatste <FIELD> element (op zich logisch).

Nu heb ik dus twee vragen:

1. Hoe maak ik de naam van een attribuut variabel? Ik heb nu <xsl:attribute name="test">, maar in plaats van "test" moet het attribuut zoals gezegd als naam de waarde van het attribuut ID krijgen.

2. Met vaste attribuut name lukt e.e.a., maar zoals gezegd slechts voor één <FIELD> element. Hoe kan ik automatisch meerdere attributen aanmaken op basis van het aantal <FIELD> elementen?
Bij elementen doe je dat via het xsl:for-each select commando, maar dat werkt niet in dit geval.


Hopelijk kan een van jullie me in de goede richting duwen....de rest van de transformatie lukt al maar dit variabele stukje is wel van belang.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Misschien een idee een [XSL] tag te gebruiken als je met XML transformaties bezig bent?

Waarom moet dit trouwens zo opgelost worden? Want er is no way dat je een DTD kunt maken voor een XML file met XML elementen met variabele attributen. Di's dus eigenlijk geen valid XML.

https://niels.nu


  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Hydra schreef op vrijdag 15 juni 2007 @ 16:56:
Misschien een idee een [XSL] tag te gebruiken als je met XML transformaties bezig bent?
Wat bedoel je hiermee?
Waarom moet dit trouwens zo opgelost worden? Want er is no way dat je een DTD kunt maken voor een XML file met XML elementen met variabele attributen. Di's dus eigenlijk geen valid XML.
Ik weet het, ik weet het...er bestaat ook geen DTD van de XML die ik als output moet krijgen. Ik noem die XML altijd een verknipt CSV bestand. Het is geen goed XML bestand, maar op dit moment het enige dat ik kan importeren in een bepaalde applicatie.

Ik heb twee opties: de aangeleverde XML transformeren naar die vage XML structuur die ik kan importeren óf de aangeleverde XML transformeren naar CSV.

Hoe ik een CSV maak van een XML weet ik sowieso al niet, dus gokte ik erop dat het met XSLT wel ging lukken om er een te importeren XML van kan maken. Voor een deel lukt dat ook wel, maar dus niet helemaal.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Dat uit je topictitel niet echt op te maken is waar het over gaat. M'n XSLT kennis is ver en diep weggestopt dus ik vrees dat ik je zelf niet echt verder kan helpen.

https://niels.nu


  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Hydra schreef op vrijdag 15 juni 2007 @ 17:14:
[...]


Dat uit je topictitel niet echt op te maken is waar het over gaat. M'n XSLT kennis is ver en diep weggestopt dus ik vrees dat ik je zelf niet echt verder kan helpen.
Oh zo...sorry ja. Ik had al op versturen geklikt en toen zag ik ook dat het handig was om die toevoeging voor de titel te plaatsen. Bij edit kreeg ik echter alleen de mogelijkheid om het bericht te wijzigen en niet meer de titel :+

Verwijderd

Kun je misschien één voorbeeldje maken van input XML -> output XML? Deze beschrijving is iets te verwarrend voor mij op de vrijdagmiddag... :P
edit:
volgens mij bedoel je zoiets:

XML:
1
2
3
4
5
6
7
8
9
10
input:
<field id="jaja">
    <value>neenee</value>
</field>
<field id="hihi">
    <value>hoho</value>
</field>

output:
<row jaja="neenee" hihi="hoho"/>

hint:
XML:
1
2
3
<xsl:attribute name="{id}">
    <xsl:value-of select="value/text()"/>
</xsl:attribute>

[ Voor 54% gewijzigd door Verwijderd op 15-06-2007 17:51 ]


  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Verwijderd schreef op vrijdag 15 juni 2007 @ 17:45:
Kun je misschien één voorbeeldje maken van input XML -> output XML? Deze beschrijving is iets te verwarrend voor mij op de vrijdagmiddag... :P
edit:
volgens mij bedoel je zoiets:

XML:
1
2
3
4
5
6
7
8
9
10
input:
<field id="jaja">
    <value>neenee</value>
</field>
<field id="hihi">
    <value>hoho</value>
</field>

output:
<row jaja="neenee" hihi="hoho"/>

hint:
XML:
1
2
3
<xsl:attribute name="{id}">
    <xsl:value-of select="value/text()"/>
</xsl:attribute>
Ik zal straks even kijken of ik een voorbeeld van input en output XML kan geven. Er staat vertrouwelijke informatie in, dus ik zal een vereenvoudigde versie online zetten.

In principe komt jouw voorbeeld echter wel overeen met wat ik wil, de structuur zoals je aangeeft is (sterk vereenvoudigd) precies wat ik bedoel.

Ik heb je suggestie verwerkt voor de XSL, maar het werkt nog niet. Als ik de output.xml open in IE, dan krijg ik deze melding:

HTML:
1
2
3
4
5
6
7
8
9
De XML-pagina kan niet worden weergegeven 
Kan XML-invoer niet lezen met opmaakmodel XSL. Herstel de fout en klik vervolgens op de knop Vernieuwen of probeer het later opnieuw. 


--------------------------------------------------------------------------------

Een naam begint met een ongeldig teken. Fout bij het verwerken van bron file:///I:/Data/XML tests/test150...

<DATAPACKET application="testapplication" version="1.0"><METADATA><FIELDS><FIELD attrname="EF11811...


Open ik de XML met Notepad++, dan zie ik dat er één attribuut is toegevoegd aan het element <ROW> en dat dit attribuut geen naam heeft maar wel een waarde.

Hij neemt de naam dus nog niet mee...de waarde nam ie ook al mee zonder die /text() achter value.

  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Hier dan voorbeelden van de input XML, de XSL en de output XML:

Input:
XML:
1
2
<?xml version="1.0" encoding="UTF-8"?>
<form title="testformulier"><question title="Uw gegevens" id="EF108311567676771612"><field css_class="formrow" enabled="true" label="Voornaam" mandatory="true" fieldName="alfanumericfield" direct_validation="false" id="EF1181115641240358411"><value>Timothee</value></field><field css_class="formrow" enabled="true" label="Achternaam" mandatory="false" fieldName="alfanumericfield" direct_validation="false" id="EF1181115641240781812"><value>Bastin</value></field><field css_class="formrow" enabled="true" label="Plaats" mandatory="true" fieldName="alfanumericfield" direct_validation="false" id="EF1181115641241056913"><value>Heerlen</value></field></question><metadata><submitTimestamp>18-05-2007 om 19:14:00</submitTimestamp><referenceNumber>123456789</referenceNumber><orderId>180579</orderId></metadata></form>


XSL:
XML:
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
88
89
90
91
92
93
94
95
96
<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
    <xsl:template match="/">
        <DATAPACKET application="testapplicatie" version="1.0">
            <METADATA>
                <FIELDS>
                    <xsl:for-each select="form/question/field">
                    <FIELD>
                    <xsl:attribute name="attrname">
                    <xsl:value-of select="@id"/>
                    </xsl:attribute>
                    <xsl:attribute name="fieldtype">
                    CHARACTER
                    </xsl:attribute>
                    <xsl:attribute name="width">
                    100
                    </xsl:attribute>                    
                    </FIELD>
                    </xsl:for-each>
                    <xsl:for-each select="form/question/multiplefield/field">
                    <FIELD>
                    <xsl:attribute name="attrname">
                    <xsl:value-of select="@id"/>
                    </xsl:attribute>
                    <xsl:attribute name="fieldtype">
                    CHARACTER
                    </xsl:attribute>
                    <xsl:attribute name="width">
                    100
                    </xsl:attribute>                    
                    </FIELD>
                    </xsl:for-each>
                    <FIELD>
                    <xsl:attribute name="attrname">
                    submitTimestamp
                    </xsl:attribute>
                    <xsl:attribute name="fieldtype">
                    CHARACTER
                    </xsl:attribute>
                    <xsl:attribute name="width">
                    100
                    </xsl:attribute>
                    </FIELD>
                    <FIELD>
                    <xsl:attribute name="attrname">
                    referenceNumber
                    </xsl:attribute>
                    <xsl:attribute name="fieldtype">
                    CHARACTER
                    </xsl:attribute>
                    <xsl:attribute name="width">
                    100
                    </xsl:attribute>
                    </FIELD>
                    <FIELD>
                    <xsl:attribute name="attrname">
                    orderId
                    </xsl:attribute>
                    <xsl:attribute name="fieldtype">
                    CHARACTER
                    </xsl:attribute>
                    <xsl:attribute name="width">
                    100
                    </xsl:attribute>
                    </FIELD>
                </FIELDS>
                <PARAMS />
            </METADATA>
            <ROWDATA>
                <xsl:for-each select="form/question/field">
                <ROW>
                    <xsl:attribute name="test">
                    <xsl:value-of select="value"/>
                    </xsl:attribute>
                </ROW>
                </xsl:for-each>
                <ROW>
                    <xsl:attribute name="test">
                    <xsl:value-of select="form/metadata/submitTimestamp"/>
                    </xsl:attribute>
                </ROW>
                <ROW>
                    <xsl:attribute name="test">
                    <xsl:value-of select="form/metadata/referenceNumber"/>
                    </xsl:attribute>
                </ROW>
                <ROW>
                    <xsl:attribute name="test">
                    <xsl:value-of select="form/metadata/orderId"/>
                    </xsl:attribute>
                </ROW>
            </ROWDATA>
        </DATAPACKET>
    </xsl:template>
</xsl:stylesheet>


Output:
XML:
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
<?xml version="1.0" encoding="utf-8"?>
<DATAPACKET application="testapplicatie" version="1.0"><METADATA><FIELDS><FIELD attrname="EF1181115641240358411" fieldtype="
                    CHARACTER
                    " width="
                    100
                    "/><FIELD attrname="EF1181115641240781812" fieldtype="
                    CHARACTER
                    " width="
                    100
                    "/><FIELD attrname="EF1181115641241056913" fieldtype="
                    CHARACTER
                    " width="
                    100
                    "/><FIELD attrname="
                    submitTimestamp
                    " fieldtype="
                    CHARACTER
                    " width="
                    100
                    "/><FIELD attrname="
                    referenceNumber
                    " fieldtype="
                    CHARACTER
                    " width="
                    100
                    "/><FIELD attrname="
                    orderId
                    " fieldtype="
                    CHARACTER
                    " width="
                    100
                    "/></FIELDS><PARAMS/></METADATA><ROWDATA><ROW test="Timothee"/><ROW test="Bastin"/><ROW test="Heerlen"/><ROW test="18-05-2007 om 19:14:00"/><ROW test="123456789"/><ROW test="180579"/></ROWDATA></DATAPACKET>


De output is nu niet correct, maar dat is logisch gezien hetgeen in de XSL staat. In plaats van meerdere <ROW> elementen maken, moet hij één <ROW> element maken met meerdere attributen, bijv. attribuut met naam EF1181115641240358411 en waarde Timothee.


BTW: als ik de output in IE bekijk, ziet het er goed uit. In een text editor staat er nogal wat rubbish tussen!? Bovendien vraag ik me af hoe ik ervoor zorg dat de XML code ook in een text editor leesbaar wordt getoond zoals in IE.

Ik hoop dat helder is wat ik als output wil krijgen. De XSL is zeker nog niet perfect, maar het is een begin (zoals gezegd ben ik nog onervaren maar is het wel een leuke oefening om de kennis opgedaan tijdens een korte cursus eens in praktijk te brengen).

  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Ik denk dat ik eens ga kijken naar de <xsl:if> en <xsl:choose> elementen. Wellicht dat ik daarmee verder kom. Dan kan ik immers controleren op het bestaan van een bepaalde ID attribuut in de bron XML en op basis daarvan zowel bovenin de doel XML als onderin de doel XML (bij het <ROW> element) nieuwe <FIELD> elementen en <ROW> attributen genereren.

Als dit al werkt is het op zich afdoende, maar dan zal ik goed moeten kijken naar de XSD van de bron XML...zodra er iets wijzigt, moet ik mijn XSL uitbreiden/aanpassen.

Zou hetgeen ik wil te doen zijn met <xsl:if> of <xsl:choose> of is het verspilde tijd om daarmee te gaan stoeien in dit geval?

  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Heeft iemand nog een tip voor me? Ik ben net nog eens mijn XML Bible aan het doorspitten en stuit op het volgende zinnetje:

...., you frequently have to rely on data that you read from the input document to determine an attribute value and sometimes even to determine the attribute name.

Met name dat laatste fragment, "even to determine the attribute name" vind ik interessant. Kennelijk is het dus wel mogelijk om de naam van een te genereren attribuut te halen uit de bron XML.

Enige minpuntje: er wordt in het boek wel uitgelegd hoe je de waarde bepaald, maar NIET hoe je de naam bepaalt en dat is nu juist wat ik wil weten :(
Met de eerder aangedragen hint kom ik er helaas ook niet.

[ Voor 4% gewijzigd door timothee op 20-06-2007 13:11 ]


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20:19

Gerco

Professional Newbie

Met <xsl:element> of <xsl:attribute> en de {} tekens.

XML:
1
2
3
<xsl:attribute name="{@someAttribute}">
  <xsl:value-of select="someValue"/>
</xsl:attribute>


Ingewikkelder kan ook:
XML:
1
2
<xsl:variable name="naampje" select="iets ingewikkelds"/>
<xsl:attribute name="{$naampje}">waarde</xsl:attribute>

[ Voor 40% gewijzigd door Gerco op 20-06-2007 13:32 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Gerco schreef op woensdag 20 juni 2007 @ 13:26:
Met <xsl:element> of <xsl:attribute> en de {} tekens.

XML:
1
2
3
<xsl:attribute name="{@someAttribute}">
  <xsl:value-of select="someValue"/>
</xsl:attribute>
Ik krijg het niet werkend. Ik heb de XSL als volgt aangepast:

XML:
1
2
3
4
5
6
7
<ROWDATA>
<ROW>
<xsl:attribute name="{@id}"> 
<xsl:value-of select="form/question/field/value"/>
</xsl:attribute>
</ROW>
</ROWDATA>


Ik heb de for-each regels maar even weg gelaten om te zien of het überhaupt werkt. In de xsl:attribute regel verwijs ik naar het attribuut "id" dat onderdeel is van het <FIELD> element in de bron XML.

Zodra ik met deze aanpassing de bron XML parse, krijg ik in de doel XML een hoop rubbish ( &#9;&#9;&#9;&#9;&#9;) voor en achter de tekst CHARACHTER en 100 te staan.

Het <ROW> element wordt correct aangemaakt met één attribuut zónder naam:

XML:
1
<ROW ="Timothee Bastin"/>


Hij leest de waarde van het <VALUE> element dus correct uit (dat deed ie sowieso al), maar de naam van het attribuut heb ik nog steeds niet.

Wat doe ik in hemelsnaam fout? Waarschijnlijk is het maar iets kleins, maar ik weet niet waar ik het zoeken moet dus ik hoop dat iemand van jullie me hiermee kan helpen.

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20:19

Gerco

Professional Newbie

timothee schreef op woensdag 20 juni 2007 @ 17:18:
Ik heb de for-each regels maar even weg gelaten om te zien of het überhaupt werkt. In de xsl:attribute regel verwijs ik naar het attribuut "id" dat onderdeel is van het <FIELD> element in de bron XML.
Dat zou op die manier gewoon moeten werken. Hoe is het met de spelling en hoofdletters van je brondocument?
Zodra ik met deze aanpassing de bron XML parse, krijg ik in de doel XML een hoop rubbish ( &#9;&#9;&#9;&#9;&#9;) voor en achter de tekst CHARACHTER en 100 te staan.
Die rommel krijg je omdat die ook in je brondocument staat. &#9; betekent niets anders dan TAB.
Het <ROW> element wordt correct aangemaakt met één attribuut zónder naam:
Vreemd. Dat is vziw niet eens geldige Xml, dat zou je nooit buiten moeten krijgen (tenzij je output method niet op Xml staat).

Hieronder een werkend voorbeeld:
XML:
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"?>
<ROOT>
    <ROW>
        <FIELD>
            <id>someField</id>
            <value>someValue</value>
        </FIELD>
        <FIELD>
            <id>someField2</id>
            <value>someValue2</value>
        </FIELD>
        <FIELD>
            <id>someField3</id>
            <value>someValue3</value>
        </FIELD>
        <FIELD>
            <id>someField4</id>
            <value>someValue4</value>
        </FIELD>
    </ROW>
</ROOT>


Xsl:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <result>
            <xsl:apply-templates select="/ROOT/ROW"/>
        </result>
    </xsl:template>

    <xsl:template match="ROW">
        <ROW>
            <xsl:for-each select="FIELD">
                <xsl:attribute name="{id}">
                    <xsl:value-of select="value"/>
                </xsl:attribute>
            </xsl:for-each>
        </ROW>
    </xsl:template>
</xsl:stylesheet>


Result:
XML:
1
2
3
<result>
    <ROW someField="someValue" someField4="someValue4" someField3="someValue3" someField2="someValue2"/>
</result>

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Gerco, bedankt voor je eerdere reactie....het werkt nu....YES!!! :D

Ik heb er dit van gemaakt:

XML:
1
2
3
4
5
6
7
8
9
<ROWDATA>
<ROW>
<xsl:for-each select="form/question/field">
<xsl:attribute name="{@id}">
<xsl:value-of select="value"/>
</xsl:attribute>
</xsl:for-each>
</ROW>
</ROWDATA>


In eerste instantie werkte het nog niet. Ik gebruikte de parser XT. Heb het toen eens geprobeerd met Stylus Studio en die genereerde wél een goeie XML! Daarna nogmaals met XT getest en nu blijft ie gewoon goed werken :?

Enfin, het werkt nu in elk geval....ben helemaal blij :P

  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Die rommel krijg je omdat die ook in je brondocument staat. &#9; betekent niets anders dan TAB.
Ook dat is opgelost. De output XML zag er in IE goed uit, maar toen ik hem niet geïmporteerd kreeg in een applicatie heb ik eens met UltraEdit gekeken en zag ik alsnog die rommel staan.
Ik had de XSL file met Stylus Studio gemaakt en voor de leesbaarheid sommige regels laten inspringen. Dat had ik dus met tabs gedaan...niet zo handig dus :)

Heb de tabs weg gehaald en nu werkt alles perfect!

Nogmaals bedankt allemaal voor de hints!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20:19

Gerco

Professional Newbie

Als je literals wilt opnemen in je output, kun je dat het beste doen zonder whitespace voor en na de tekst. Als je de letterlijke text toch wilt laten inspringen kun je <xsl:text> gebruiken:
XML:
1
2
3
<xsl:attribute name="blah">
  <xsl:text>wat tekst</xsl:text>
</xsl:attribute>

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Thanx voor die laatste toevoeging.
Nu ik voor het eerst écht bezig ben met XSLT merk ik dat er toch nog wel de nodige vragen naar boven komen. Drie dagen basiscursus XML is niet echt veel merk ik nu...:)

  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Ik heb weer een vraagje...omdat het in het verlengde ligt van bovenstaande stel ik de vraag maar gewoon binnen dit topic.

Ik ben inmiddels weer een stuk verder en heb er een XSLT 2.0 stylesheet van gemaakt zodat ik gebruik kan maken van het <xsl:result-document> element. Dat werkt perfect. Ik krijg 1 input XML bestand met verwijzingen naar meerdere geuploade bestanden. Voor elk geupload bestand maak ik een aparte XML aan met verwijzing en relatie naar het hoofd-XML bestand.

Nu wil ik in het hoofd XML bestand in het output bestand een attribuut toevoegen waarvan de waarde voor een deel vast en een deel variabel is.

Ik maak een attribuut aan met <xsl:attribute> en een vaste naam. Tot nu toe gebruikte ik voor de waarde altijd een <xsl:value-of select=> om de waarde van een ander element of attribuut als waarde te gebruiken.
Nu wil ik echter dat de waarde van mijn nieuwe attribuut bestaat uit een naam die deels vast en deels variabel is. De volledige naam is de naam van een PDF bestand en in die naam zit een nummer dat uniek is. Dat nummer is overigens wel de waarde van een element in het bron XML bestand.

Tot nu toe lukt het me alleen om tekst als waarde te krijgen. Tekst om het <value-of select=> element zetten heeft ook geen zin merk ik.

Weet iemand hoe ik dit doe?


P.S. een voorbeeldje:

XML:
1
2
3
<xsl:attribute name="bestandsnaam">
vastedeelvandebestandsnaam_variabeledeel_nogeenstukjevastetekst.pdf
</xsl:attribute>


Zoals gezegd, het "variabeledeel" is de waarde van een element uit de bron XML


Als ik dan toch aan het vragen ben: als ik met <xsl:if> werk en aangeef dat een waarde groter moet zijn dan 0 doet ie wat ie moet doen zolang het getal in de bron XML gescheiden wordt met punten, bijv. 12.5. Zodra er 12,5 staat in de bron XML, werkt de <xsl:if> voorwaarde niet meer :?
Waarschijnlijk allemaal simpele dingen, maar ik weet niet waar ik het moet zoeken. Juist door dit soort ervaringen word je wel heel snel veel wijzer.

[ Voor 20% gewijzigd door timothee op 28-06-2007 23:55 ]


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20:19

Gerco

Professional Newbie

timothee schreef op donderdag 28 juni 2007 @ 21:59:
Nu wil ik echter dat de waarde van mijn nieuwe attribuut bestaat uit een naam die deels vast en deels variabel is.
Deze is zo simpel dat er vaak over antwoord heen gekeken wordt :)
XML:
1
2
3
4
5
<xsl:attribute name="bestandsnaam">
  <xsl:text>vastedeelvandebestandsnaam_</xsl:text>
  <xsl:value-of select="variabeledeel"/>
  <xsl:text>_nogeenstukjevastetekst.pdf</xsl:text>
</xsl:attribute>
Zodra er 12,5 staat in de bron XML, werkt de <xsl:if> voorwaarde niet meer:?
Dat komt omdat hij 12,5 niet als getal ziet omdat de amerikaanse decimale punt een punt is en geen komma. Ik weet even niet of daar een makkelijke oplossing voor is, zou ik op moeten zoeken. Wat je in ieder geval kunt doen is die komma door een punt replacen in je xsl:if, maar dat is natuurlijk smerig :)

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Gerco schreef op vrijdag 29 juni 2007 @ 07:38:
[...]


Deze is zo simpel dat er vaak over antwoord heen gekeken wordt :)
XML:
1
2
3
4
5
<xsl:attribute name="bestandsnaam">
  <xsl:text>vastedeelvandebestandsnaam_</xsl:text>
  <xsl:value-of select="variabeledeel"/>
  <xsl:text>_nogeenstukjevastetekst.pdf</xsl:text>
</xsl:attribute>
Kijk, had ik het toch bijna goed :) Ik had naar jouw laatste opmerking gekeken over het <xsl:text> element en had daar dus al mee getest. Maar ik had het verkeerd gedaan, want de parser gaf aan dat het <xsl:text> element geen subelementen mocht bevatten. Ik heb deze suggestie van jou nu nog niet getest, maar het ziet er in elk geval een stuk logischer uit dan wat ik zelf had gedaan. Inderdaad nogal simpel, maar dat is alles als je het een keer gedaan hebt....vaak ga je te moeilijk doen :)
Dat komt omdat hij 12,5 niet als getal ziet omdat de amerikaanse decimale punt een punt is en geen komma. Ik weet even niet of daar een makkelijke oplossing voor is, zou ik op moeten zoeken. Wat je in ieder geval kunt doen is die komma door een punt replacen in je xsl:if, maar dat is natuurlijk smerig :)
Omzetten naar punt is eigenlijk niet echt een optie omdat het om bedragen gaat die weer door een applicatie verwerkt moeten worden :)
Een komma in de xsl:if werkte overigens niet...dan zegt de parser dat er een foutief teken staat.

Verwijderd

Als het alleen positieve getallen zijn: "if not 0" ...

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
timothee schreef op maandag 25 juni 2007 @ 20:48:
Thanx voor die laatste toevoeging.
Nu ik voor het eerst écht bezig ben met XSLT merk ik dat er toch nog wel de nodige vragen naar boven komen. Drie dagen basiscursus XML is niet echt veel merk ik nu...:)
Als je nog veel met XSLT zal werken dan is het volgende boek een echte aanrader: http://www.amazon.com/XSL...-Programmer/dp/0764569090

Wellicht kan je het via je werk aanschaffen?

Heb zelf heel veel aan het boek gehad toen ik een lange tijd met XSLT werkte. Helaas boek nu niet bij me (op mijn nieuwe werkplek) en het is al weer een tijdje geleden dat ik met XSLT gewerkt hebt, dus kan niet direct vragen beantwoorden :)

Edit: ik had het boek dat over de 1.0 specificatie ging en daarin werd ook XPath behandeld. Blijkbaar bevat deze nieuwe versie geen hoofdstukken meer over XPath, maar is dat een los boek geworden. Dat is erg jammer.

[ Voor 13% gewijzigd door MacWolf op 29-06-2007 09:21 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
@Gerco: thanx man, dit werkt zoals gewenst! :)

@mark platvoet: ook die tip staat op het lijstje om te proberen.

@MacWolf: ik had ook al eens gekeken of er goeie boeken bestaan over XSLT en dan met name de nieuwe 2.0 specificatie. Zo'n naslagwerk is toch wel handig want met zoeken op internet kom je er ook wel maar dat kost ontzettend veel tijd (als je al weet waar je moet zoeken en op welke termen).
Ik heb drie dagen XML cursus bij Capgemini gehad en daaraan de XML 1.1 Bible over gehouden. Goed boek, maar echt niet "100% comprehensive" zoals erop staat (ook niet zo verwonderlijk).
Het moet geen probleem zijn om deze boeken via het werk aan te schaffen, dus dat ga ik ook zeker vragen.
Ik ben blij dat ik nu eindelijk eens wat kan doen met de cursusstof....zoals gezegd blijkt nu dat drie dagen opleiding best weinig is, maar ik krijg er wel meer plezier in :)
Volgende cursus moet een programmeercursus worden want ik ben geen programmeur...dat bemoeilijkt het soms.
Pagina: 1