---
title: "XSLT padding"
type: "forum-thread"
url: "https://www.webforum.nu/amne/xml/185252-xslt-padding"
topic: "XML"
topic_url: "https://www.webforum.nu/amne/xml"
author: "newberg"
published: "2010-11-15T12:46:59.000Z"
updated: "2010-11-30T10:50:17.000Z"
replies: 63
views: 3904
page: 1
pages: 4
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/xml/185252-xslt-padding"
---

# XSLT padding

_Sida 1 av 4._

## #1 — newberg, 2010-11-15T12:46Z

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?

Permalänk: https://www.webforum.nu/p/185252

## #2 — aron, 2010-11-15T13:32Z

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)

Permalänk: https://www.webforum.nu/p/2259577

## #3 — SPiN, 2010-11-15T13:40Z

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;')" />
```

Permalänk: https://www.webforum.nu/p/2259581

## #4 — newberg, 2010-11-15T13:49Z

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>

Permalänk: https://www.webforum.nu/p/2259583

## #5 — aron, 2010-11-15T14:28Z

> **[newberg skrev:](https://www.webforum.nu/p/1522831)**
>
> 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)

Bilagor:

- [word-spacing.PNG](https://www.webforum.nu/a/22207.png)

Permalänk: https://www.webforum.nu/p/2259586

## #6 — newberg, 2010-11-15T14:53Z

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'?

Permalänk: https://www.webforum.nu/p/2259589

## #7 — newberg, 2010-11-15T15:14Z

<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...

Permalänk: https://www.webforum.nu/p/2259592

## #8 — aron, 2010-11-15T15:51Z

> **[newberg skrev:](https://www.webforum.nu/p/1522843)**
>
> 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.

Permalänk: https://www.webforum.nu/p/2259599

## #9 — newberg, 2010-11-16T08:47Z

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

Permalänk: https://www.webforum.nu/p/2259657

## #10 — newberg, 2010-11-16T13:15Z

Ingen som har någon mer ide?

Permalänk: https://www.webforum.nu/p/2259691

## #11 — SPiN, 2010-11-16T13:58Z

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.

Permalänk: https://www.webforum.nu/p/2259696

## #12 — newberg, 2010-11-17T08:17Z

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?

Permalänk: https://www.webforum.nu/p/2259765

## #13 — SPiN, 2010-11-17T11:49Z

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.

Permalänk: https://www.webforum.nu/p/2259795

## #14 — newberg, 2010-11-17T13:12Z

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

Permalänk: https://www.webforum.nu/p/2259805

## #15 — newberg, 2010-11-17T13:41Z

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.

Permalänk: https://www.webforum.nu/p/2259809

## #16 — newberg, 2010-11-17T14:46Z

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 /\>?

Permalänk: https://www.webforum.nu/p/2259817

## #17 — SPiN, 2010-11-18T08:10Z

> 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()](http://zvon.org/xxl/XSLTreference/Output/function_substring-before.html) samt [substring-after()](http://zvon.org/xxl/XSLTreference/Output/function_substring-after.html).

> 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. :)

Permalänk: https://www.webforum.nu/p/2259859

## #18 — newberg, 2010-11-18T09:08Z

> **[SPiN skrev:](https://www.webforum.nu/p/1523139)**
>
> 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...

Permalänk: https://www.webforum.nu/p/2259860

## #19 — SPiN, 2010-11-18T09:21Z

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>
```

Permalänk: https://www.webforum.nu/p/2259862

## #20 — newberg, 2010-11-18T09:53Z

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 :)

Permalänk: https://www.webforum.nu/p/2259863

---

Tråden på webben: https://www.webforum.nu/amne/xml/185252-xslt-padding  
Nästa sida: https://www.webforum.nu/amne/xml/185252-xslt-padding/page2.md
