Xslt array

Tags:    xml

Hej folkens

Jeg har tre næsten ens noder, der kun adskiller sig fra hinanden med et tal.

Eks:
Fold kodeboks ind/udKode 


Disse tre vil jeg gerne have i en select box, så de ligger som options.

Eks:
Fold kodeboks ind/udKode 


Mit umiddelbare bud på løsningen er at man laver en slags array i xslt og gennemløber og udskriver det.
Men hvordan laver man lige sådan en manøvre i xslt, kan det overhovedet lade sig gøre? eller er løsningen en helt anden?

Er der nogen, der har nogen bud på hvordan man dynamisk kan gøre dette?

Jeg bruger xslt 1.0



7 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
her er færdigt eksempel:

Nodes.xml:
<nodes>
<node1>node1</node1>
<node2>node2</node2>
<node3>node3</node3>
</nodes>

Nodes.xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<select>
<xsl:apply-templates select="node()/*[substring(name(), 0, 5)='node']" mode="Options"></xsl:apply-templates>
</select>
</xsl:template>

<xsl:template match="*" mode="Options">
<option value="{.}"><xsl:value-of select="concat(position(), ' ' , .)" /></option>
</xsl:template>
</xsl:stylesheet>

output:
<?xml version="1.0" encoding="UTF-8"?>
<select>
<option value="node1">1 node1</option>
<option value="node2">2 node2</option>
<option value="node3">3 node3</option>
</select>


Sig til hvis noget skal uddybes ydeligere..


Update: i xslt filen er der en linie der ser sådan her ud:

<xsl:apply-templates select="node()/*[substring(name(), 0, 5)='node']" mode="Options"></xsl:apply-templates>

ng skal erstattes af substring aner ikke hvorfor den cutter det af..

Update: Arghh den fucker det altså helt totalt op.. prøver lige uden [code blokke]

msn:jokke@maritek.dk hvis du skal have de færdige eksempler det her fora fucker totat :)

/JJ







Indlæg senest redigeret d. 02.11.2007 13:44 af Bruger #5789
Umiddelbart vil jeg sige at du skal have kigget på det XML, hvis det begrebsmæssigt er det samme der er meningen med noden, bør den også hedde det samme, og der så være en attribut der afgører det der skal være din "value", det vil sige en beskrivende værdi.

Mener at man i XPath kan få fat i et nodes children, så det er måske vejen at gå, men kan ikke se nogle løsningsforslag, da de i princippet er forskellige entiteter.

Med min begrænsede viden, vil jeg vove den på stand at det eksempel du viser ikke er det der fra W3C var ideen med XML. Noget i denne retning ville være mere korrekt:

<item value="node1">Node 1</item>
<item value="node2">Node 2</item>
<item value="node3">Node 3</item>

Hvor det så er attributten der er beskrivende overfor entiteten item

/B



Tak for svar Brian

Der er i dette tilfælde desværre ikke mulighed for at ændre i xml strukturen, selvom jeg godt kan se fordelene.

Jeg må se om Xpath har noget, der kan bruges i dette tilfælde.



Nej det kan let klares med simpel xslt:foreach, eller bare med xpath og templates.

dine <node1> må ligge i en parent..

ex:

<nodes>
<node1/>
<node2/>
</nodes>

<!-- Rammer rodnoden -->
<xsl:template match="/nodes">
<select>
<!-- Rammer alle undernoder, . = samme node, * = alle -->
<xsl:applytemplates select="./*" mode="Selects" />
</select>
</xsl:template>

<!-- Ny template til options, har sat "mode" til select så den ikke rammer andet da match er *, alternativt lav det med "xsl:call-template" -->
<xsl:template match="*" mode="Selects">
<!-- Kan godt være det skal være select="./text()" men bør ikke være nødvendigt -->
<option value="{.}"><xsl:value-of select="." /></option>
</xsl:template>

Update: er utestet, men du skulle fange ideen.

/JJ



Indlæg senest redigeret d. 02.11.2007 13:44 af Bruger #5789
Hvis der ligger andet end <node1> vil de selvfølgeligt også blive behandlet, men med substring-befpre(name(), 4) vil vel altid være <node?> så du kan også ramme dem mere præsist der.

Men kender ikke ret meget til opgaven.

/JJ







Mange tak for svaret.
Det var lige hvad jeg havde brug for, og fik også lært lidt mere Xslt.



t