Avatar billede xsltquestion Nybegynder
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>
Avatar billede jokkejensen Novice
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, '&#xD;&#xA;&#xA;    ', '')"
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
Avatar billede xsltquestion Nybegynder
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, '&#xD;&#xA;&#xA;    ', '')" 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>
Avatar billede jokkejensen Novice
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
Avatar billede xsltquestion Nybegynder
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>
Avatar billede jokkejensen Novice
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
Avatar billede xsltquestion Nybegynder
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>
Avatar billede jokkejensen Novice
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
Avatar billede jokkejensen Novice
16. april 2008 - 12:08 #8
<xsl:when test="$theLink !=''"><xsl:copy-of select="/item[@key='$theLink']" /></xsl:when>
Avatar billede xsltquestion Nybegynder
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. :-)
Avatar billede jokkejensen Novice
16. april 2008 - 13:36 #10
(jeg kopierede bare dit ;) )

<xsl:copy-of select="/item[@key=substring-after($text,'/')]" />
Avatar billede jokkejensen Novice
16. april 2008 - 13:37 #11
Nej okay, den fejl lavede jeg selv.
Avatar billede jokkejensen Novice
16. april 2008 - 13:38 #12
kommer NodeSet ikke til at indeholde noget ?

/JJ
Avatar billede xsltquestion Nybegynder
16. april 2008 - 17:13 #13
ja den indeholder ikke noget.
Avatar billede jokkejensen Novice
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
Avatar billede xsltquestion Nybegynder
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.
Avatar billede xsltquestion Nybegynder
20. april 2008 - 16:09 #16
300 points til den der kan løse problemet.
Avatar billede jokkejensen Novice
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
Avatar billede jokkejensen Novice
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.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester