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 fra Cognizant
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