2012-04-10 8 views
6

Utilizziamo Altova Stylevision che produce file XSLT 2.0. Usiamo Saxon 9 per Java per eseguire questi file XSLT. Questo ha funzionato bene per alcuni anni, purtroppo nessuno di noi capisce veramente XSLT.XSLT 2.0 genera un errore: "la voce di contesto non è definita"

Ora abbiamo l'errore:

Error at /xsl:stylesheet/xsl:function[9] 
XPDY0002: Axis step child::element(item, xs:anyType) cannot be used here: 
    the context item is undefined 

La funzione 9 è:

<xsl:function name="sps:GoogleChartDataSourceUnitCount" as="xs:string"> 
    <xsl:sequence select="concat(string-join(item/string(if (number($XML/report/calculation-data[@data-source-name = $DataSourceParent]/item/variable[@name=&apos;unit_count&apos;]/@value) &lt; 0) then 0 else round-half-to-even(number(variable[@name=&apos;unit_count&apos;]/@value),2)),&apos;,&apos;),&apos;&amp;chxl=0:|&apos;,string-join(item/variable[@name=&apos;month&apos;]/@value,&apos;|&apos;),&apos;|2:||Min&amp;chds=0,&apos;,string(round-half-to-even(max(item/(number(variable[@name=&apos;unit_count&apos;]/@value)))+1 , 0)),&apos;&amp;chxr=1,0,&apos;,string(round-half-to-even(max(item/(number(variable[@name=&apos;unit_count&apos;]/@value)))+1 , 0)))"/> 
</xsl:function> 

Qualcuno ha idea di cosa sta succedendo?

risposta

8

Il problema è che la funzione utilizza espressioni di percorso come item che necessita di un elemento di contesto come the specification mandates "All'interno del corpo di una funzione foglio di stile, l'attenzione è inizialmente definito, ciò significa che ogni tentativo di riferimento l'elemento del contesto, posizione di contesto o la dimensione del contesto è un errore dinamico non recuperabile. [XPDY0002] ". Quindi la funzione deve avere un parametro che passa nel nodo o nella sequenza di nodi a cui il percorso dovrebbe essere applicato, ad es.

<xsl:function name="sps:GoogleChartDataSourceUnitCount" as="xs:string"> 
    <xsl:param name="nodes"/> 
    <xsl:sequence select="concat(string-join($nodes/item/string(...)))"/> 
</xsl:function> 

e quindi deve essere chiamato con ad es. sps:GoogleChartDataSourceUnitCount(.).

Se il foglio di stile è generato da alcuni strumenti di Altova, è possibile che si desideri chiedere allo Altova forums se si tratta di un problema noto e se è disponibile una correzione.

7

Come per lo W3C XSLT 2.0 specification, la voce di contesto iniziale per un xsl:function non è definita.

Ciò significa che all'interno del corpo della funzione qualsiasi riferimento ai dati (elementi) può avvenire solo su parametri off (passati o globali) o variabili.

Il problema è che l'espressione nel codice fornito inizia con:

concat(string-join(item ... 

e questo viola chiaramente la regola di cui sopra - item viene fatto riferimento fuori un elemento di contesto, che non è consentito fumare all'interno della uno xsl:function.

La soluzione:

  1. Passare l'elemento di contesto inteso come un parametro (consigliato) dicono di nome pDoc, o di avere una variabile/parametro globale contenere l'elemento di contesto previsto.

  2. Elementi di riferimento nel primo passo di locazione di un'espressione XPath fuori che il parametro/variabile, per esempio $pDoc/item

FAQ: Perché questa limitazione?

Risposta: Non consentire un elemento di contesto iniziale implicito rende possibile per il processore XSLT eseguire un'analisi statica più estesa e ottimizzare il codice in modo molto più aggressivo.

3

È possibile che si verifichi questo problema da diversi casi d'uso. Per me, dal momento che ho dimenticato di inserire il segno di dollaro ($) prima del parametro all'interno della mia funzione, in modo che il processore pensi che sto usando un tag di nodo senza indicare il contesto, quindi restituisce questo errore. Ho semplicemente bisogno di mettere $ prima del mio param. Spero che la mia soluzione sia utile per gli altri.

Problemi correlati