webForumDet fria alternativet

XSLT padding

63 svar · 3 813 visningar · startad av newberg · sida 2 av 4

newbergMedlem sedan nov. 201040 inlägg
#21

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
#22

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
#23

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
#24

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
#25

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
#26

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
#27

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
#28

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
#29

Okej, jag provar! Återkommer med resultat...

newbergMedlem sedan nov. 201040 inlägg
#30

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
#31

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
#32

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
#33

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: &#160 ;

SPiNMedlem sedan mars 20005 832 inlägg
#34

Det kallas för entiteter, och jag har för mig att newline's entitet är

newbergMedlem sedan nov. 201040 inlägg
#35

'&#13 ;' funkade för mig! Tack än en gång Spin!

newbergMedlem sedan nov. 201040 inlägg
#36

Kan man inte göra concat i en for-each loop?

<xsl:for-each select="concat(väg/till/string1, '&#13 ;', 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
#37

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
#38

Provade följande utan lycka:

<xsl:for-each select="vägen/till">
<xsl:value-of select="concat(String1, '&#13 ;', String2)"/> 
</xsl:for-each>

Men kanske är något på spåren?

SPiNMedlem sedan mars 20005 832 inlägg
#39

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
#40

Den skriver enbart ut newlines.

Genererad på 385 ms · cache AV · v20260730165559-full.f96bc7eb