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

[XSL] Enkele node uit resultaat-nodes call-template

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

  • r0bert
  • Registratie: September 2001
  • Laatst online: 28-11 00:42
Ik heb na veel googlen en doen een oplossing voor onderstaand probleem gevonden, door het steeds in een variabele te plaatsen. Deze oplossing past echter niet binnen het concept en is nogal omslachtig, vandaar dat ik een nieuwe oplossing zoek die ik door middel van google of de zoekfunctie op het forum niet heb kunnen vinden.

Ik ga vanuit XSL verschillende templates aanroepen waarin natuurlijk een nesting zal zitten. Nu is de input voor een geneste template, niet altijd de output van de andere template. Zo kan deze gesplitst zijn, of slechts een deel van het resultaat bevatten.

bijv.
code:
1
2
3
4
5
6
7
8
9
psuedo:

template:get_one_node
   param node_record
      template:unique_nodes
         param node select $node /
      /
   /
/

(alle templates hebben een @name)

In bovenstaand voorbeeld geeft template:unique_nodes alle unieke nodes terug. Dat is veelste veel, want ik wil alleen de eerste node hebben (get_one_node). De param 'node_record' zou dus van het resultaat van template:unique alleen de node '*[1]' moeten hebben, maar hiervoor kan ik geen syntax bedenken in XSLT behalve de variabele wat niet afdoende is.

Is er iemand die me hiermee op weg kan helpen?

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Ik denk dat je beter wat meer context kunt geven, dan heb ik misschien wel een oplossing voor je probleem. Mijn oplossing bestaat erin dat je gewoon alle nodes die je initiëel wil matchen afloopt, behalve dat je alleen degene matcht die op een bepaalde XPath-selectie niet matchen aan alle nodes die je al gehad hebt. Daarmee heb je het unieke ding al gehad, en hoef je niet recursief te doen, of iets raars met dat je van je lijst met unieke nodes alleen de eerste wil. Zou dat ook helpen?

Rustacean


  • r0bert
  • Registratie: September 2001
  • Laatst online: 28-11 00:42
Het gaat niet op de functies, daar kan iedere willekeurige functienaam staan. Het gaat puur om de structuur om van een gereturnde nodeset van een call-template, bepaalde nodes (bijv. door XPath) te selecteren.

Een return van unique:nodes kan bijv zijn:
XML:
1
2
3
4
5
<nodes>
   <node id="1">value</node>
   <node id="2" />
   <node id="3">value</node>
</nodes>

Die return van de call-template wil ik gebruiken als param voor get_one_node, maar dan alleen de eerste node. Of alleen de derde. Om die selectie te doen zoek ik een oplossing.

Zo zou je het als volgt kunnen doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
psuedo:

variable $node
   template:unique_nodes
         param node select $node /
   /
/

template:get_one_node
   param node_record
      copy-of $variable[1] /
   /
/

Maar dit past dus niet binnen de structuur. De nesting is wel degelijk van belang.

  • r0bert
  • Registratie: September 2001
  • Laatst online: 28-11 00:42
Een uitwerking als dit zou ook een oplossing zijn, maar ik weet niet of dit uberhaupt werkend te krijgen is in XSLT:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<xsl:template match="/">
   <xsl:apply-templates />
</xsl:template>

<xsl:template match="core:callTemplate">
    <xsl:param name="resultQuery" value="node()" />
    
    <xsl:variable name="templateResult">
        <xsl:call-template name="{@name/text()}">
            <xsl:for-each select="./core:param">
                <xsl:param name="{@name}">
                    <xsl:copy-of select="./node()" />
                </xsl:param>
            </xsl:for-each>
        </xsl:call-template>
    </xsl:variable>
            
    <xsl:copy-of select="$templateResult/{$resultQuery}" />
</xsl:template>


Maar behalve dat bovenstaande code natuurlijk niet werkt, is de aanroep dan ook moeilijk voor elkaar te krijgen:
XML:
1
2
3
4
5
6
7
8
9
10
<core:callTemplate name="get_one_node">
   <core:param name="node_record">
      <core:callTemplate name="unique_nodes">
         <core:resultQuery>*[1]</core:resultQuery>
         <core:param name="node">
              1
         </core:param>
      </core:callTemplate>
   </core:param>
</core:callTemplate>

Als iemand weet hoe ik dit werkend kan krijgen ben ik natuurlijk ook al heel erg blij :)

[ Voor 3% gewijzigd door r0bert op 04-12-2007 22:19 ]


  • r0bert
  • Registratie: September 2001
  • Laatst online: 28-11 00:42
Ik heb het tijdelijk opgelost door te gebruik te maken van een extensie in eXSLT. Een betere oplossing is erg welkom, tot die tijd heb ik het met de volgende template opgelost:

XML:
1
2
3
4
5
6
7
8
9
10
11
<xsl:template match="core:callTemplate" mode="construct"> 
    <xsl:variable name="resultPath">
        *[name() = 'voorbeeldtag']
    </xsl:variable>
    
    <xsl:variable name="templateResult">
        <xsl:apply-templates select="../core:callTemplate" mode="execute" />
    </xsl:variable>

    <xsl:copy-of select="dyn:map($templateResult, $resultPath)" />
</xsl:template>

met
XML:
1
2
3
4
5
<xsl:template match="core:callTemplate[@name = 'core:functionname']" mode="execute">
   <path>path1</path>
   <path>path2</path>
   <path>path3</path>
</xsl:template>

Verwijderd

zou kunnen dat ik je volledig verkeerd versta, maar waaom niet gewoon een <xsl:copy-of select="nodes/node[id = 1]"/> ?

  • r0bert
  • Registratie: September 2001
  • Laatst online: 28-11 00:42
En hoe zie je dat in de code dan?

De conditie voor welke node kan wisselen, bijvoorbeeld eerste node, of laatste, of met id 1 of met id 2.

Het is de output van een call-template. Hoe wil je dat opvangen? Want je doet nu 'nodes/node[..]' maar er is helemaal geen 'nodes' ?

Misschien dat ik het in een stukje code als bovenstaande beter begrijp?
Pagina: 1