Hoe de waarde van een variabele in een udf in te stellen die een pad-call vereist

Ik probeer een door de gebruiker gedefinieerde functie in XSLT te gebruiken die herhaaldelijk de waarde van een bepaalde reeks aanroept. Die reeks is gebaseerd op de uitkomst van een XPath-uitdrukking die niet verandert binnen de tijdsspanne van één enkele functieaanroep. Ik dacht dat het een goed idee zou zijn om het aan een variabele toe te wijzen in plaats van het steeds opnieuw op te zoeken.

Helaas, in ieder geval in de implementatie van Saxon, kun je geen XPath-expressie gebruiken die een knoop in een functie vereist, zelfs een op basis van een absoluut pad, zonder eerst een weggooiverbinding te gebruiken om de functie te laten weten dat je het rootdocument bespreekt in plaats van een andere.

Dus de volgende code gooit bijvoorbeeld een foutmelding:




Normaal gesproken is de oplossing alleen maar om elke globale variabele eerst context te geven. Bijvoorbeeld, de volgende werken binnen een udf ($ root is een variabele geïdentificeerd met het root-knooppunt):




Maar dit werkt niet wanneer ik Xpath probeer te gebruiken om de waarde van een variabele te bepalen, omdat ik de expressie niet binnen een for-each mag plaatsen.

Ik heb ook geprobeerd om te gebruiken


to give it context, going on what I saw here:http://www.stylusstudio.com/xsllist/200504/post00240.html

Dat werkte ook niet.

FWIW, het doorgeven van de variabele aan de functie is problematisch omdat de Xpath-expressie die wordt gebruikt om "myleaf" te definiëren, afhankelijk is van het contextknooppunt, en ik niet weet hoe Xpath een pad moet krijgen op basis van waarden in het huidige contextknooppunt.

In de code die deze functie aanroept, bijvoorbeeld, heb ik iets als:




Ik werk in de context van een/potato/stem [eye] -knoop en gebruik de udf om naar een/potato/stem [scc] -knooppunt te zoeken met dezelfde waarde als @sessionID. Ik weet niet hoe ik moet verwijzen naar de waarde van @sessionID van het huidige contextknooppunt in het predikaat van een XPath die zoekt naar andere knooppunten in een heel ander deel van de XML-structuur, dus ik gebruikte hiervoor een udf. Het werkte prima totdat ik besloot om een ​​variabele voor de string te gebruiken in plaats van dat de processor het elke keer opzoekde.

Ik probeerde te voorkomen dat ik een niveau dieper ging (mijn functie zelf noemde een benoemde sjabloon of een benoemde sjabloon in mijn originele for-each zetten en die benoemde template een functie noemen).

Dus mijn vragen zijn:

A. Hoe stel ik voor een door de gebruiker gedefinieerde functie een variabele in die afhangt van een XPath-uitdrukking?

B. Is er een snazzy manier in Xpath om waarden te gebruiken die zijn getrokken uit het huidige inhoudknooppunt in de predikaten van de Xpath-expressie die u probeert te testen?

0
Ik heb een voorbeeld geplaatst met de relevante xml over een andere vraag die zich alleen concentreert op de vraag hoe attributen te gebruiken die gerelateerd zijn aan het huidige knooppunt (bijvoorbeeld in een for-each-component) in een XPath-uitdrukking die een andere zoekt. Die vraag is hier link
toegevoegd de auteur David R, de bron
@_David R: Helaas is het moeilijk om de vraag te begrijpen. Kunt u de vraag alstublieft bewerken en een volledig (maar kort) voorbeeld geven, zodat het kan worden gereproduceerd? Vertel ons ook precies wat u wilt bereiken. Geef alsjeblieft ook het corresponderende (zo kort mogelijke) volledige XML-brondocument op. Wat is in het bijzonder de betekenis van "proberen Xpath te gebruiken om de waarde van een variabele te bepalen"?
toegevoegd de auteur Dimitre Novatchev, de bron
@_David R: Bedankt, ik heb de nieuwe vraag beantwoord.
toegevoegd de auteur Dimitre Novatchev, de bron

1 antwoord

Dus mijn vragen zijn:

     

A. Voor een door de gebruiker gedefinieerde functie, hoe stel ik een variabele in die afhankelijk is   op een XPath-expressie?

     

B. Is er een snazzy manier in Xpath om waarden te gebruiken die uit de stroom zijn getrokken   inhoudsknooppunt in de predikaten van de Xpath-expressie die u probeert   om te testen?

Beide vragen zijn vrij onduidelijk.

A: Ik neem aan dat je eigenlijk bedoelt:

"In een xsl: function hoe definieer ik een variabele die afhankelijk is van   het contextknooppunt? "

The answer: You can't. By definition there is no context node within an xsl:function. This is defined by the W3C XSLT 2.0 specification in the following way:

" In het kader van een stijlbladfunctie is de focus aanvankelijk   undefined; dit betekent dat elke poging om naar het contextitem te verwijzen,   contextpositie of contextgrootte is een niet-herstelbare dynamische fout.   [XPDY0002] "

U kunt echter als een parameter het beoogde contextknooppunt doorgeven (of alleen het documentknooppunt dat als actueel moet worden gebruikt). Of u kunt ook verwijzen naar een globaal gedefinieerde variabele.

B: Deze vraag is volledig niet te begrijpen:

  1. Wat is "snazzy"?

  2. Wat is "current content node"? Geef alsjeblieft een voorbeeld van een specifieke taak die moet worden volbracht op de gewenste "snazzy" manier.

0
toegevoegd
Bedankt voor het beantwoorden van de eerste vraag. Met betrekking tot het spellen van mijn verzoek voor de tweede, zijn hier details: Die vraag is hier koppeling
toegevoegd de auteur David R, de bron