Avatar billede lklingenberg Nybegynder
28. marts 2006 - 12:35 Der er 14 kommentarer og
1 løsning

nodeset fra key kan ikke findes

Hi E,

Jeg har et spøjst problem. Det lader til at et nodeset jeg henter fra en key kun kan findes i visse sammenhænge og i andre kan den ikke findes.

Jeg har en template, hvor jeg fx angiver:
<xsl:value-of select="key('findTekstNr', 54)/tekst[@sprog=$sprog]"/>

I denne specifikke template, kan jeg ikke få udskrevet værdien fra det node-set.

Hvis jeg derimod angiver følgende:
<xsl:variable name="tekst" select="key('findTekstNr', 54)/tekst[@sprog=$sprog]"/>
<xsl:value-of select="$tekst"/>

Bliver værdien fra node-settet skrevet ud...

Warum?
Avatar billede Slettet bruger
28. marts 2006 - 13:12 #1
- Hvordan er din key defineret?
- Hvilken XSLT Processor bruger du?

/CS
Avatar billede lklingenberg Nybegynder
28. marts 2006 - 13:50 #2
Min key ser således ud:
<xsl:key name="findTekstNr" match="tekst" use="@nummer"/>

Strukturen i XML'en ser således ud:
<tekster>
...
<tekst nummer="54" navn="tekstOpslået">
  <tekst sprog="da">Opslået</tekst>
  <tekst sprog="en">Posted</tekst>
</tekst>
...
</tekster>

Min processor er Microsofts MSXML .NET
Avatar billede Slettet bruger
28. marts 2006 - 14:45 #3
Har lige testet med 4 forskellige processorer på Mac OS X - 2 af dem giver korrekt output ligegyldigt hvilken metode der bruges, de 2 andre giver intet output, ligeledes uafhængigt af metoden...

- Hvis jeg ændrer opslagsværdien (54) til en string ('54') er der kun een af dem der stadig ikke giver noget resultat.

Det fungerer altså sikkert hvis du quote'er den søgte værdi:

key('findTekstNr', '54')/tekst[@sprog=$sprog]

/CS
Avatar billede Slettet bruger
28. marts 2006 - 14:48 #4
Forresten har XML indbygget en form for sprog-support vha. xml:lang attributten og lang() funktionen:

<tekst xml:lang="da">Opslået</tekst>

key('findTekstNr', '54')/tekst[lang($sprog)]

/CS
Avatar billede lklingenberg Nybegynder
28. marts 2006 - 14:54 #5
Hm, det virker stadig ikke. Jeg kommer i tanke om, at opslaget sker i en for-each løkke. Kan det være forklaringen - alle node-henvisninger sker jo relativt til løkkens udgangs-node.
Avatar billede lklingenberg Nybegynder
28. marts 2006 - 14:54 #6
Tak for tippet om xml:lang!
Avatar billede Slettet bruger
28. marts 2006 - 15:03 #7
Det eneste sted det kan være et problem, er ved værdien du sender til key() - hvis du istedet for 54 har f.eks. @id eller lign., skal denne naturligvis udregnes fra current-node...

/CS
Avatar billede lklingenberg Nybegynder
28. marts 2006 - 15:17 #8
Jeg sender kun de værdier med key(), jeg selv indtaster...
Avatar billede Slettet bruger
28. marts 2006 - 15:42 #9
Jeg opdagede lige at din xsl:key også forsøger at indeksere de inderste <tekst> elementer - det er nok ikke så fikst, performancemæssigt.

Prøv at sætte match="tekst[@nummer]" på <xsl:key> elementet - så indekserer den kun de tekst elementer der har en nummer attribut.

Kan du give et eksempel på din for-each?

/CS
Avatar billede lklingenberg Nybegynder
28. marts 2006 - 21:27 #10
<xsl:template match="felt[@typeid=22]">
<xsl:param name="type"/>
<xsl:choose>
  <xsl:when test="$foredragid!=''">
  ...
  </xsl:when>
  <xsl:otherwise>
  <xsl:variable name="slutdato">
    <xsl:choose>
    <xsl:when test="func:urlEncode(key('findFelt', $feltid)/ekstraXmlInfo/dage)=-1 or func:urlEncode(key('findFelt', $feltid)/ekstraXmlInfo/dage)=-1000">
      <xsl:value-of select="func:alterDate('yyyy-MM-dd')"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="'0'"/>
    </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="startdato">
    <xsl:choose>
    <xsl:when test="func:urlEncode(key('findFelt', $feltid)/ekstraXmlInfo/dage)=-1 or func:urlEncode(key('findFelt', $feltid)/ekstraXmlInfo/dage)=-1000">
      <xsl:value-of select="'1900-01-01'"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="'nu'"/>
    </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="kursus_stillinger">
    <xsl:choose>
    <xsl:when test="$type!=''">
      <xsl:value-of select="$type"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:choose>
      <xsl:when test="$kursusid=$kursus_homepage_intranet">
        <xsl:value-of select="$kursus_stillinger_ekstern"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$kursus_stillinger_nbi"/>
      </xsl:otherwise>
      </xsl:choose>
    </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
 
  <xsl:variable name="ISISJobXml"  select="concat('http://isis.ku.dk/isis/scripts/foredragv1/xml_foredrag.aspx?kategori=stillingsopslag&amp;kursusid=', $kursus_stillinger, '&amp;startdato=', $startdato, '&amp;slutdato=', $slutdato)"/>
  <xsl:variable name="ISISJobXmlDoc" select="document($ISISJobXml)"/>
 
  <xsl:choose>
    <xsl:when test="count($ISISJobXmlDoc/event:ISIS/event:foredrag)=0">
    <h1><xsl:value-of select="overskrift"/></h1>
    <p><xsl:value-of disable-output-escaping="yes" select="key('findTekst', 'tekstTilIngenEmner')/tekst[lang($sprog)]"/></p>
    </xsl:when>
    <xsl:otherwise>
    <h1><xsl:value-of select="overskrift"/></h1>
   
    <xsl:for-each select="$ISISJobXmlDoc/event:ISIS/event:foredrag">
      <xsl:sort select="event:start" order="descending" />
      <div style="border: solid 1px {$farve_logo}; padding: 5px; margin-bottom: 20px;">
      <xsl:if test="event:titel[.!=''] or event:titelE[.!='']">
        <p class="date_italic">
        <xsl:value-of disable-output-escaping="yes" select="key('findTekst', 'tekstOpslået')/tekst[lang($sprog)]"/> <xsl:value-of select="func:formatDateInt(event:start, $sprog, 'false')"/>
        </p>
        <h2>
        <a href="{concat(func:side($sprog, $felt_stillinger_vis), '?foredragid=', event:foredragid, '&amp;lang=', $sprog)}">
          <xsl:choose>
          <xsl:when test="$sprog='en'">
            <xsl:value-of disable-output-escaping="yes" select="event:titelE"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of disable-output-escaping="yes" select="event:titel"/>
          </xsl:otherwise>
          </xsl:choose>
        </a>
        </h2>
        <xsl:choose>
        <xsl:when test="$sprog='en'">
          <xsl:value-of disable-output-escaping="yes" select="func:truncate(event:abstraktE, 300, key('findTekstNr', '55')/tekst[lang($sprog)])"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of disable-output-escaping="yes" select="func:truncate(event:abstrakt, 300, key('findTekstNr', '55')/tekst[lang($sprog)])"/>
        </xsl:otherwise>
        </xsl:choose>
      </xsl:if>
      </div>
    </xsl:for-each>
    </xsl:otherwise>
  </xsl:choose>
  </xsl:otherwise>
</xsl:choose>

</xsl:template>
Avatar billede lklingenberg Nybegynder
29. marts 2006 - 12:19 #11
Som du måske kan se, har jeg prøvet med to metoder:
<xsl:key name="findTekst" match="tekst[@nummer]" use="@navn"/>
<xsl:key name="findTekstNr" match="tekst[@nummer]" use="@nummer"/>

seleft="key('findTekst', 'tekstOpslået')/tekst[lang($sprog)]"
seæect="key('findTekstNr', '55')/tekst[lang($sprog)]"
Avatar billede lklingenberg Nybegynder
04. april 2006 - 11:08 #12
ingen bud, greystate?
Avatar billede Slettet bruger
04. april 2006 - 23:36 #13
Nej, beklager - jeg har ret svært ved at få mening ud af den chunk du har pastet... altså umiddelbart ser der ikke ud til at være "fejl" i det, men jeg har ingen XML data, og (vigtigere) ikke mulighed for at afprøve med .NET parseren...

/CS
Avatar billede lklingenberg Nybegynder
05. april 2006 - 10:52 #14
oki - du skal alligevel have tak for indsatsen!
Avatar billede Slettet bruger
05. april 2006 - 11:06 #15
Det er ingen problem da - skulle det være en anden gang :-)

/CS
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