16. april 2008 - 09:25
Der er
18 kommentarer
Variabler i XSLT
Jeg vil gerne bruge værdien i en "valueFromTemplate" variabel hvor jeg henter en xpath sti fra en template. Denne xpath værdi skal bruges i min for-each løkke: <xsl:variable name="valueFromTemplate"> item </xsl:variable> <xsl:variable name="value" select="$valueFromTemplate" /> <xsl:for-each select="$value"> <xsl:value-of select="@key" /> </xsl:for-each> Dette virker ikke "item" bliver ikke øverført til min for-each. Det ønskede resultat: <xsl:for-each select="$value"> <xsl:value-of select="@key" /> </xsl:for-each> */////////// Virker ikke ///////////* <xsl:variable name="valueFromTemplate"> item </xsl:variable> <xsl:variable name="value" select="$valueFromTemplate" /> <xsl:for-each select="$value"> <xsl:value-of select="@key" /> </xsl:for-each> */////////// Virker - men hvorfor virker det første eksempel ikke ///////////* <xsl:variable name="value" select="item" /> <xsl:for-each select="$value"> <xsl:value-of select="@key" /> </xsl:for-each>
Annonceindlæg tema
Cloud & AI
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
16. april 2008 - 10:01
#1
Når du i en variable skriver <xsl:variable name="value" select="item" /> Tager den indhold fra item noden for den gælende match på templaten. Men skriver du bare : <xsl:variable name="valueFromTemplate"> item </xsl:variable> Får du en tekst variable med 2 newlines, et par tabs og en masse space samt ordet "item" i. De kan dog trimmes til "item" med ; <xsl:value-of select="translate($valueFromTemplate, '

 ', '')" disable-output-escaping="yes" /> Den jeg tror du leder efter er: <xsl:variable name="valueFromTemplate"><xsl:value-of select="item" /></xsl:variable> == <xsl:variable name="valueFromTemplate" select="item" /> /JJ
16. april 2008 - 10:48
#2
Mit problem er at det ikke virker at kopiere "item" fra en variabel til en anden. <xsl:variable name="valueFromTemplate">item</xsl:variable> <xsl:variable name="value" select="$valueFromTemplate" /> Virker ikke hvorfor ?????(System.Xml.Xsl.XslTranformationExeption) <xsl:variable name="valueFromTemplate">item</xsl:variable> <xsl:variable name="valueFromTemplateStriped"> <xsl:value-of select="translate($valueFromTemplate, '

 ', '')" disable-output-escaping="yes" /></xsl:variable> <xsl:for-each select="$valueFromTemplateStriped"> <xsl:value-of select="@key"/> </xsl:for-each> Er ikke det samme (Hvorfor): <xsl:variable name="Works" select="item" /> <xsl:for-each select="$Works"> <xsl:value-of select="@key"/> </xsl:for-each>
16. april 2008 - 10:54
#3
Det er fordi du siger: <xsl-foreach select="'item'" /> altså tager en streng ned og forsøger at iterere på den. Du skal tage et nodeset med ned. <xsl-foreach select="item" /> som vil tage alle item noderne.. Men måske du skulle beskrive hvad du vil, i stedet for jeg forsøger at gætte mig til resultatet. Vh. JJ
16. april 2008 - 11:11
#4
Her er min kode: <xsl:variable name="xpath">/*/item[@key='content']/item[@key='home']/item[@key='current']/item[@key='events']</xsl:variable> <xsl:variable name="test" select="$xpath" /> <xsl:for-each select="$test"> <xsl:value-of select="@key"/> </xsl:for-each> Jeg vil gerne have følgende resultat: <xsl:for-each select="/*/item[@key='content']/item[@key='home']/item[@key='current']/item[@key='events']"> <xsl:value-of select="@key"/> </xsl:for-each> Jeg kalder en template i 'xpath' variablen - der så generere mit XPath output - <xsl:variable name="XPath"> <xsl:call-template name="GetPath" /> </xsl:variable>
16. april 2008 - 11:29
#5
okay, og så er det du skal forstå, at du ikke kan have xpath i en variable, så bliver det til en tekst streng. Vil du gerne have en dynamisk xpath query ? Dit følgende resultat er det den korrekte måde at gøre det på, dog har sitecore mere fornuftige metoder at lave en select item på. /JJ
16. april 2008 - 11:56
#6
Ja, jeg vil gerne have en dynamisk XPath query. Hvordan ville du løse dette problem? Jeg tager et Sitecore link felt laver det om til Xpath - som jeg så vil bruge i min <for-each select="xpath"> løkke. Resultatet er XPath fra et Sitecore link - nu skal jeg 'bare' bruge min XPath i min for-each <!--==============================================================--> <!-- Create link into XPATH & Lower Camelcase. --> <!--==============================================================--> <!-- Call Template --> <xsl:call-template name="stripContentToXpath"> <xsl:with-param name="text" select="sc:fld('link',.)"/> </xsl:call-template> <!-- Template--> <xsl:template name="stripContentToXpath"> <xsl:param name="text"/> <xsl:param name="links"/> <xsl:variable name="LCLetters">abcdefghijklmnopqrstuvwxyzæøå</xsl:variable> <xsl:variable name="UCLetters">ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ</xsl:variable> <xsl:variable name="XPath"> <xsl:value-of select="translate($text,$UCLetters,$LCLetters)"/> </xsl:variable> <xsl:variable name="afterLinkText" select="substring-after($XPath,'/')"/> <xsl:variable name="theLink" select="substring-before($afterLinkText,'/')"/> <xsl:choose> <xsl:when test="$theLink ='sitecore'">/*</xsl:when> <xsl:when test="$theLink !=''">/item[@key='<xsl:value-of select="$theLink"/>']</xsl:when> <xsl:otherwise>/item[@key='<xsl:value-of select="substring-after($text,'/')"/>']</xsl:otherwise> </xsl:choose> <xsl:if test="contains($afterLinkText,'/')"> <xsl:call-template name="stripContentToXpath"> <xsl:with-param name="text" select="$afterLinkText"/> </xsl:call-template> </xsl:if> </xsl:template>
16. april 2008 - 12:07
#7
Jeg er stadig ikke helt med, men forstår jeg dig korrekt, er det her du opretter de ønskede xpath udtryk: <xsl:choose> <xsl:when test="$theLink ='sitecore'">/*</xsl:when> <xsl:when test="$theLink !=''">/item[@key='<xsl:value-of select="$theLink"/>']</xsl:when> <xsl:otherwise>/item[@key='<xsl:value-of select="substring-after($text,'/')"/>']</xsl:otherwise> </xsl:choose> Hvis du nu laver den om til, i psuedo kode: <xsl:variable name="NodeSet"> <xsl:choose> <xsl:when test="$theLink ='sitecore'"><xsl:copy-of select="/*" /></xsl:when> <xsl:when test="$theLink !=''"><xsl:copy-of select="/item[@key='$theLink'] /></xsl:when> <xsl:otherwise><xsl:copy-of select="/item[@key='substring-after($text,'/')']" /></xsl:otherwise> </xsl:choose><xsl:variable> Så har du <xsl:foreach select="msxsl:node-set($NodeSet/item)" /> Det er utestet, blot til illustration. /JJ
16. april 2008 - 12:08
#8
<xsl:when test="$theLink !=''"><xsl:copy-of select="/item[@key='$theLink']" /></xsl:when>
16. april 2008 - 12:37
#9
Mange tak for input JokkeJensen. Det virker desværre ikke, jeg prøvede at omskrive min variabel - jeg får ikke noget output med din NodeSet variabel. Din <xsl:otherwise> <xsl:copy-of select="/item[@key='substring-after($text,'/')']" /> </xsl:otherwise> validerer heller ikke. pooof. :-)
16. april 2008 - 13:36
#10
(jeg kopierede bare dit ;) ) <xsl:copy-of select="/item[@key=substring-after($text,'/')]" />
16. april 2008 - 13:37
#11
Nej okay, den fejl lavede jeg selv.
16. april 2008 - 13:38
#12
kommer NodeSet ikke til at indeholde noget ? /JJ
16. april 2008 - 17:13
#13
ja den indeholder ikke noget.
17. april 2008 - 15:37
#14
<xsl:value-of select="$theLink" /> <xsl:variable name="NodeSet"> <xsl:choose> <xsl:when test="$theLink ='sitecore'"><xsl:copy-of select="/*" /></xsl:when> <xsl:when test="$theLink !=''"><xsl:copy-of select="/item[@key='$theLink'] /></xsl:when> <xsl:otherwise><xsl:copy-of select="/item[@key='substring-after($text,'/')']" /></xsl:otherwise> </xsl:choose><xsl:variable> <xsl:value-of select="count($NodeSet)" /> Hvad får du af output på den? /JJ
20. april 2008 - 16:08
#15
Jeg får en xslt fejl på count(). Og jeg får ikke noget output på din NodeSet variabel.
20. april 2008 - 16:09
#16
300 points til den der kan løse problemet.
21. april 2008 - 12:38
#17
altså count skal jo virke, og returnere 0 eller mere.. jeg har ingen muligheder for at debugge det.. Kan du sige hvor det går galt ? Hvad er $theLink når den kommer til <xsl:choose> ? /JJ
21. april 2008 - 12:40
#18
200 point er max. Ellers må du oprette den gennem job/opgaver, og smide en pris på - så skal jeg nok klare den gennem sitecores developer center.
Kurser inden for grundlæggende programmering