Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[XSL] value-of werkt wel, maar zelfde query daarna niet

Pagina: 1
Acties:

  • r0bert
  • Registratie: September 2001
  • Laatst online: 28-11 00:42
Ik loop tegen een heel vaag probleem in XSLT. Ik mag wel een value-of van de variabele pakken, maar niet gebruiken in een query erna:
XML:
1
2
3
4
5
6
7
8
9
    <xsl:template match="core:callTemplate[@name = 'core:join']" mode="execute">
        <xsl:param name="params" />
        
        <xsl:value-of select="$params[1]/text()" />
        
        <xsl:element name="{$params[1]/text()}">
                   tag
        </xsl:element>
    </xsl:template>


De value-of geeft dus netjes 'body' bijv., maar xsl:element geeft vervolgens de foutmelding:
code:
1
2
- runtime error: file /var/www/client/jronline.nl/httpdocs/functions.xsl line 53 element element 
- xsl:element : invalid name

Enig idee hoe dat kan? Ik gebruik gewoon standaard PHP DOM, dus eXSLT.org . De {} in het xsl:element attribute 'name' zorgen ervoor dat de waarde behandelt wordt als een xpath query, volgens de specificatie is dat ok.

Hopelijk kan iemand me v erder helpen... :)

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Laat de XML eens zien die je gebruikt?

  • r0bert
  • Registratie: September 2001
  • Laatst online: 28-11 00:42
Dat ligt iets gecompliceerder.

Ik zal wel even het hele script posten, komt ie:
XML:
XML:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<core:root xmlns:core="http://www.sove.nl/core/">
    <core:callTemplate name="core:join"> 
        <core:param>
                [ HIER EEN ANDERE callTemplate ]
        </core:param>
    </core:callTemplate>
</core:root>

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    <xsl:template match="core:root">
        <xsl:apply-templates select="core:callTemplate" mode="construct" /> 
    </xsl:template>
    
    <!-- Belangrijkste gedeelte vanaf hier //-->
<xsl:template match="core:callTemplate" mode="construct">           
    <xsl:variable name="returnResult">
        <xsl:apply-templates select="descendant::core:callTemplate" mode="construct" />     
    </xsl:variable>

    <xsl:variable name="resultPath"> 
            <xsl:choose>
                <xsl:when test="resultPath"><xsl:value-of select="resultPath/text()" /></xsl:when>
                <xsl:otherwise>.</xsl:otherwise>
            </xsl:choose>
    </xsl:variable> 

    <xsl:variable name="templateResult">
        <xsl:apply-templates select="../core:callTemplate" mode="execute"> 
        <xsl:with-param name="params" select="exslt:node-set($returnResult)|*" />
      </xsl:apply-templates>
    </xsl:variable> 

    <xsl:copy-of select="dyn:map($templateResult, $resultPath)" /> 
</xsl:template>
<!-- Belangrijkste gedeelte tot hier //-->  
    
    <xsl:template match="core:callTemplate[@name = 'core:join']" mode="execute">
        <xsl:param name="params" />
        
        <xsl:value-of select="$params[1]/text()" />
        <!-- #################################### //-->
        <!-- ####  Hier gaat het dus fout!   #### //-->
        <!-- #################################### //-->
        <xsl:element name="{$params[1]/text()}">
            <!-- meer //-->
        </xsl:element>
    </xsl:template>

Het gaat dus ergens fout door de combinatie van de variabele en de gewone nodes denk ik:?

Edit:
De fout moet 'm in de variabele of in de node-set functie zitten, want 'param[2]/text()' werkt wel weer prima (die is niet meer uit de variabele/node-set)

[ Voor 28% gewijzigd door r0bert op 07-12-2007 17:23 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik had zelf een stukje XML en XSL geschreven om jouw geval te reproduceren en liep daarbij tegen hetzelfde probleem aan. Het zit hem in het feit dat er enter en/of een tab in je xml staat. De .text() haalt alles op wat tussen de tags staat, inclusief returns, spaties en tabs. En dat maakt dus dat
XML:
1
2
3
<eenofAndereNode>
   body
</eenofAndereNode>

een andere betekenis heeft dan:
XML:
1
<eenofAndereNode>body</eenofAndereNode>


En een name van een xsl:element mag geen enters etc bevatten. Dat was het probleem bij mij in elk geval.

  • r0bert
  • Registratie: September 2001
  • Laatst online: 28-11 00:42
Geniaal! Dat kan bij mij heel goed kloppen! Ik zal eens kijken of ik iets met strip-whitespace ofzo kan doen?