webForumDet fria alternativet

XSLT padding

63 svar · 3 813 visningar · startad av newberg

newbergMedlem sedan nov. 201040 inlägg
#1

Hallå

sitter och försöker få till en padding där jag lägger till blanka(space) i en string.

Ex: String "Hej" ska bli "Hej ".

Har försökt med något i den här stilen utan att få det att funka:
<xsl:value-of
select="substring(concat($string, ' '), 1, 12))"/>

Kan nämna att jag är ny med XSLT...

Har lyckats googla fram att man ska kunna göra ett template och sedan anropda det. Men det lyckas jag inte heller få till, och jag vet ärligt inte riktigt hur man sak gå tillväga när man anropar ett template med olika parametrar etc.
Så här ser ett template ut som folk verkar använda sig av:
<xsl:template name="pad">
<xsl:param name="s"/>
<xsl:param name="len"/>
<xsl:variable name="spaces"> ... </xsl:variable>
<xsl:value-of select="substring(concat($s, $spaces), 1, $len)"/>
</xsl:template>

Någon som har några tips och konkreta ideer till mig?

aronMedlem sedan mars 2004487 inlägg
#2

Hej

Om du bara är ute efter att få större mellanrum mellan ord bör du kanske använda "word spacing" (http://www.w3.org/TR/xsl/#word-spacing) i stället.

Jag vet inte heller hur man kör med parametrar, jag har bara använt för att transformera egengjord xml-fil direkt till HTML. (och när jag testar det i Chrome nu funkar det inte alls, men funkade i FF en gång i tiden, och jag kopierade den genererade HTML-koden och använde den direkt efteråt. /edit: var 2005 lol)

SPiNMedlem sedan mars 20005 832 inlägg
#3

Vill du bara lägga till ett blanksteg efter "Hej"?

<xsl:value-of select="$string" /><xsl:text>#160;</xsl:text>

Bör göra jobbet.

Eller om du uttryckligen vill sätta ihop strängen och blanksteget med concat(), kanske följande fungerar;

<xsl:value-of select="concat($string, '&#160;')" />
newbergMedlem sedan nov. 201040 inlägg
#4

förstår inte riktigt vad den gör när jag läser länken...
Det är på den nivån jag ligger, behöver konkreta exempel för att se hur det funkar.

Men frågan är om den funktionen kan utföra det jag behöver.
Jag har alltså en sträng som kan vara mellan 5-16 tecken lång. Är strängen mindre än 16 så ska man fylla upp resten med blanka<space>.

<xsl:value-of 
select="substring(concat($string, ' '), 1, 16))"/>

Denna skulle funka utmärkt, men av någon jävla anledning så får jag det inte att lira.

Sitter förnärvarande och testar i w3schools "try-it"-editor, pga av att min ordinarie dator har kraschat.
Kan det vara anledningen till att det inte funkar? Den editorn ska ju ändå stödja XSLT.
Jag får den att acceptera koden och skriver ut någonting, men den skriver inte ut det jag vill.

Här är länk till editorn: http://w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_ex3

aronMedlem sedan mars 2004487 inlägg
#5

newberg skrev:

Jag har alltså en sträng som kan vara mellan 5-16 tecken lång. Är strängen mindre än 16 så ska man fylla upp resten med blanka<space>.

Är jag helt ute och cyklar om jag tror du är ute efter nått i stil med exempel tre på min fina paint-bild (bifogad)?

Edit: x em i bilden skulle vara x mellanslag, ett mellanslag kan variera i längd men är oftast mellan 1/5-em och 1/3-em. (exempel två har alltså antagligen word-spacing: 2/3em eftersom jag lagt in två mellanslag mellan orden)

word-spacing.PNG
newbergMedlem sedan nov. 201040 inlägg
#6

Okej, ja det borde väl funka. Ser så ut iaf!
Du har inte lust att skriva det i kod så jag ser hur syntaxen ska vara i en 'select value-of'?

newbergMedlem sedan nov. 201040 inlägg
#7

http://www.xsltfunctions.com/xsl/functx_pad-string-to-length.html

Denna funktion verkar ju helt optimal för mina behov.
Men syntaxen är alldelels för invecklad för mig.

Varför måste man "bygga upp" funktionen så.
Borde ju kunna skriva

<xsl:value-of select=Pad-string-to-length(arg,arg,arg)>

Någon som vet hur jag implementerar koden i länken för att få det att funka.
Alltså, ska koden ligga på något särskilt ställe etc.
Jag ska använda denna paddning på ca 10 strängar, måste man skriva all den koden varje gång?

Många dumma frågor, jag vet...

aronMedlem sedan mars 2004487 inlägg
#8

newberg skrev:

Varför måste man "bygga upp" funktionen så.
Borde ju kunna skriva

<xsl:value-of select=Pad-string-to-length(arg,arg,arg)>
<xsl:value-of select="functx:pad-string-to-length(string, '_', 30)" />

Borde funka tycker man men den skriver bara ut 30 för mig.

newbergMedlem sedan nov. 201040 inlägg
#9

Får det inte heller att funka. Editiorn verkar acceptera koden, men inget skrivs ut.

newbergMedlem sedan nov. 201040 inlägg
#10

Ingen som har någon mer ide?

SPiNMedlem sedan mars 20005 832 inlägg
#11

Använd entiteten &#160, som jag föreslog. Följande enkla exempel visar hur det fungerar:

xml-file.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xsl-file.xsl"?>
<xmlroot>
	<xmlnodeone>Hej</xmlnodeone>
	<xmlnodetwo>du glade.</xmlnodetwo>
</xmlroot>

xsl-file.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="/">
		<html>
		<body>
			<pre>
				<xsl:variable name="spaces">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</xsl:variable>
				<xsl:value-of select="substring(concat(xmlroot/xmlnodeone, $spaces), 1, 12)" /><xsl:value-of select="xmlroot/xmlnodetwo" />
			</pre>
		</body>
		</html>
	</xsl:template>
</xsl:stylesheet>

Tänk på att flera blanksteg i följd inte visas i en normal webläsare, utan trunkeras till ett (1) blanksteg. Att sätta output inom ett par <pre>-taggar gör att du dock kan se dom med blotta ögat.

newbergMedlem sedan nov. 201040 inlägg
#12

Kanon, tack! Har inte hunnit prova än men jag antar att det funkar.

Nu till nästa grej.

Jag ska göra samma sak med numeriska fält. Men där ska fälten högerställas och fyllas ut med nollor. Ex 15,50 -> 000000015,50

Någon ide?

SPiNMedlem sedan mars 20005 832 inlägg
#13

Möjligtvis:

<xsl:variable name="zeroes">0000000000</xsl:variable>
<xsl:value-of select="substring($zeroes, (12 - string-length(xmlroot/xmlnodethree))" />
<xsl:value-of select="xmlroot/xmlnodethree" />

Alltså att du hämtar antalet nollor baserat på hur många tecken det är i värdet som ska paddas.

newbergMedlem sedan nov. 201040 inlägg
#14

Ja alltså jag vet att talet ska vara 16 tecken långt. Men det kommer att komma in tal som inte är 16 tecken. Då ska jag padda upp med 0:or så talet blir 16 tecken långt.

Som exemplet 1554,87893 blir 00000001554,87893

newbergMedlem sedan nov. 201040 inlägg
#15

Ytterligare problem. inte nog med att jag ska padda en sträng, vilket Spin hjälpte mig med. Nu ska jag först dela upp strängen i nya strängar innan jag paddar.
Ideer?

Så dels problemet ovan, och nu det här.

newbergMedlem sedan nov. 201040 inlägg
#16

Spin, jag får inte koden för högerpaddning med 0:or att funka. Där du skriver: xmlroot/xmlnodethree, är väl sökvägen till det man vill padda?

Och är raden <xsl:value-of select="xmlroot/xmlnodethree" /> nödvändig?

har inte behövt avsluta en sökväg så där förut.
Du avslutar väl den på raden ovan med />?

SPiNMedlem sedan mars 20005 832 inlägg
#17

Ytterligare problem. inte nog med att jag ska padda en sträng, vilket Spin hjälpte mig med. Nu ska jag först dela upp strängen i nya strängar innan jag paddar.
Ideer?

Titta på funktionerna substring-before() samt substring-after().

Spin, jag får inte koden för högerpaddning med 0:or att funka. Där du skriver: xmlroot/xmlnodethree, är väl sökvägen till det man vill padda?

Och är raden <xsl:value-of select="xmlroot/xmlnodethree" /> nödvändig?

har inte behövt avsluta en sökväg så där förut.
Du avslutar väl den på raden ovan med />?

Du kan vara tvungen att lyfta ut sträng-längden till en egen variabel innan den används i en funktion möjligtvis.

Och den sista raden är nödvändig, då den skriver ut värdet - raden innan skriver bara ut rätt antal nollor. :)

newbergMedlem sedan nov. 201040 inlägg
#18

SPiN skrev:

Du kan vara tvungen att lyfta ut sträng-längden till en egen variabel innan den används i en funktion möjligtvis.

förstår antagligen inte vad du menar, men jag får det inte att lira, även när jag lyfter ut stränglängden. Men som sagt, inte säker på att jag gör det korrekt...

SPiNMedlem sedan mars 20005 832 inlägg
#19

Det här fungerar:

base.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
<base>
	<node>144,12331</node>
</base>

stylesheet.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	
	<xsl:template match="/">
		<html>
			<body>
				<xsl:variable name="zeroes">0000000000000000</xsl:variable>
				<xsl:variable name="length" select="16 - string-length(base/node)" />
				<xsl:value-of select="substring($zeroes, 1, $length)" /><xsl:value-of select="base/node" />
			</body>
		</html>
	</xsl:template>
	
</xsl:stylesheet>
newbergMedlem sedan nov. 201040 inlägg
#20

Spin, min hjälte. Tack!

Nu går jag på problemet med att stycka upp en längre sträng till flera mindre.
Och det ska jag alltså göra med hjälp av substring-before och substring-after?
jag provar och återkommer ifall det skiter sig :)

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