newbergMedlem sedan nov. 201040 inlägg
En fråga bara.
Det kommer komma in en lång sträng som kommer att kunna vara av olika längd.
Ex. ibland 16 tecken och ibland 23 tecken osv.
Kan jag ens stycka strängen när tecknet för styckningen kommer att variera från gång till gång. Då måste man väl in och hårdkoda på varje enskild sträng?
SPiNMedlem sedan mars 20005 832 inlägg
Kan du ge två exempel på hur strängar kan se ut och hur dom ska se ut efter formateringen? Frågan är om din modell är korrekt om du inte riktigt vet vilket tecken som är avgränsare? Eller är det en längd som agerar avgränsare?
newbergMedlem sedan nov. 201040 inlägg
En inkommande sträng ser ut så här: XXXXXXXXXXXXXXXX
denna långa sträng ska sedan styckas pga av att den innehåller olika information på olika platser.
MEN, det jobbiga är att en viss typ av info kan ha olika längd. Ibland är info1 mellan tecken 1-3 och ibland mellan 1-5.
Det är även därför jag ska padda. För att fylla upp dessa strängar till dess maxlängd.
Tyvärr finns ingen bra delimiter heller, då tex. info1 som består av ett numeriskt värde följs av info2 som också består av ett numeriskt värde.
SPiNMedlem sedan mars 20005 832 inlägg
Om det inte finns någon avgränsare mellan info 1 och info 2, som tillsammans bildar strängen "123456789" (123 är info 1 och 456789 är info 2) är det omöjligt att formatera strängen (till och med för den mänskliga hjärnan). Det måste alltså finnas något som avgränsar info 1 från info 2.
newbergMedlem sedan nov. 201040 inlägg
Du har rätt. Det finns delimiters, av alla dess olika slag. Kan vara mellanslag, ny rad, / - tecken osv. Så jag måste alltså på något sätt först stycka strängen ända fram till delimitern och sedan padda. Dessutom ska vissa strängar styckas på flera ställen.
några idéer?
SPiNMedlem sedan mars 20005 832 inlägg
Byt ut alla möjliga avgränsare till en och samma (här är ett exempel på en replace()-funktion för XSLT 1.0).
Efter det får du splitta upp strängen på varje avgränsare (här är ett exempel på split() för XSLT 1.0) och efter det köra dina paddnings-funktioner.
newbergMedlem sedan nov. 201040 inlägg
Du ska ha stort tack för allt du hjälp mig med(hittills) :)
Dessa funktioner är egentligen bara plug-n-play förutom att jag får sätta in mina variablenamn och avgränsare osv?
SPiNMedlem sedan mars 20005 832 inlägg
newberg skrev:
Du ska ha stort tack för allt du hjälp mig med(hittills) :)
Så lite så!
newberg skrev:
Dessa funktioner är egentligen bara plug-n-play förutom att jag får sätta in mina variablenamn och avgränsare osv?
Nja, till viss del. Det kan bli lite knep och knåp för att få det att lira såklart, men dom är generella och bör fungera out-of-the-box. Ett tips är att integrera dina padding-funktioner som templates också, och göra ytterligare en template som sköter replace/split/padding i ett svep.
newbergMedlem sedan nov. 201040 inlägg
Okej, jag provar! Återkommer med resultat...
newbergMedlem sedan nov. 201040 inlägg
Medan jag trixar med ovanstående så tänkte jag att jag slänger fram det sista problemet som ska åtgärdas:
Det är så att emellanåt så kommer det komma in en drös med strängar som ligger varannan string1 och varannan string2.
I dagsläget så kör jag for-each loopar som skriver ut samtliga string1 och samtliga string2.
resultatet blir att först hamnar alla string1 efter varann och därefter alla sträng2.
Problemet är att strängarna är beroende av varann. Så string1 måste följas av string2 för att det ska bli korrekt.
Idag:
1,1,1,1,1,1,1
2,2,2,2,2,2,2
Som jag vill ha det: 1,2,1,2,1,2,1,2,1,2
Några ideer?
newbergMedlem sedan nov. 201040 inlägg
Har försökt med en string-join function enligt nedan.
<xsl:value-of select="string-join(Vägen/till/String1,Vägen/till/string2,' ')"/>
Men får det inte att fungera tyvärr.
Är det en bra väg att gå med string-join eller finns det ett bättre alternativ?
SPiNMedlem sedan mars 20005 832 inlägg
string-join() är specad i XSLT 2.0, inte 1.0 vilket de flesta parsers använder -- tyvärr.
Har du bara två värden som ska slås ihop, kan du ju använda
<xsl:value-of select="concat(Vägen/Till/String1, ' ', Vägen/Till/String2)" />
Annars får du nästla en massa concat()s (eller skapa en template som gör det åt dig).
newbergMedlem sedan nov. 201040 inlägg
Jag tror det borde funka. Men, kan jag använda 'ny rad' som avgränsare?
provade att trycka enter mellan ' ', men det verkade inte funka. Kan man skriva 'ny rad' på samma sätt som man skriver mellanslag så här:   ;
SPiNMedlem sedan mars 20005 832 inlägg
Det kallas för entiteter, och jag har för mig att newline's entitet är
newbergMedlem sedan nov. 201040 inlägg
'
 ;' funkade för mig! Tack än en gång Spin!
newbergMedlem sedan nov. 201040 inlägg
Kan man inte göra concat i en for-each loop?
<xsl:for-each select="concat(väg/till/string1, '
 ;', väg/till/string2)"/>
Denna kod funkar om man kör value-of, men ändrar jag till for-each så skiter det sig.
SPiNMedlem sedan mars 20005 832 inlägg
Nej, det blir omöjligt då en for-each ska loopa igenom ett elements barn-noder, och inte strängar. Du kan ju däremot göra strängmanipuleringen inuti for-each-loopen, antingen sätta den till en variabel eller skriva ut den.
newbergMedlem sedan nov. 201040 inlägg
Provade följande utan lycka:
<xsl:for-each select="vägen/till">
<xsl:value-of select="concat(String1, '
 ;', String2)"/>
</xsl:for-each>
Men kanske är något på spåren?
SPiNMedlem sedan mars 20005 832 inlägg
Vad fungerar inte? Koden är nämligen inget fel på. Tänk dock på att även en ren radbrytning inte visas i webläsaren, om du inte har ett fixed-width element utanför (som t.ex. <pre>). Vill du att det ska bli en radbrytning i html är det ju taggen <br> som du ska använda.
newbergMedlem sedan nov. 201040 inlägg
Den skriver enbart ut newlines.