2012-04-10 7 views
6

Utilizamos Altova Stylevision, que produce archivos XSLT 2.0. Usamos Saxon 9 para Java para ejecutar estos archivos XSLT. Esto ha estado funcionando bien durante algunos años, lamentablemente ninguno de nosotros en realidad entiende XSLT.XSLT 2.0 produce error: "el elemento de contexto no está definido"

Ahora tenemos el error:

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 función noveno es:

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

¿Alguien tiene alguna idea de lo que está pasando?

Respuesta

8

El problema es que la función utiliza expresiones de ruta como item la que necesita un elemento de contexto como the specification mandates "Dentro del cuerpo de una función de hoja de estilo, la atención se centra inicialmente indefinida, lo que significa que cualquier intento de hacer referencia al elemento de contexto, la posición contexto , o el tamaño del contexto es un error dinámico no recuperable. [XPDY0002] ". Por lo tanto, la función debe tener un parámetro que pase en el nodo o secuencia de nodos a los que se debe aplicar la ruta, p.

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

y luego debe ser llamado con, p. sps:GoogleChartDataSourceUnitCount(.).

Si la hoja de estilos es generada por alguna herramienta de Altova, es posible que desee consultar en el Altova forums si este es un problema conocido y si hay una solución disponible.

7

Según el W3C XSLT 2.0 specification, el elemento de contexto inicial para xsl:function no está definido.

Esto significa que dentro del cuerpo de la función cualquier referencia a los datos (elementos) puede ocurrir solo fuera de los parámetros (pasados ​​o globales) o variables.

El problema es que una expresión en el código proporcionado comienza con:

concat(string-join(item ... 

y esto claramente viola la regla anterior - item está referenciado de un elemento de contexto, que no está permitido en el interior de un xsl:function.

La solución:

  1. Pasar el elemento de contexto pretende ser un parámetro (recomendado) Di llamado pDoc, o tener una variable/parámetro global contienen el elemento de contexto previsto.

  2. Elementos de referencia en el primer paso de localización de una expresión XPath fuera de ese parámetro/variable, por ejemplo $pDoc/item

FAQ: ¿Por qué es esta limitación?

Respuesta: No permitir un elemento de contexto inicial implícito hace posible que el procesador XSLT realice un análisis estático más extenso y optimice el código de forma mucho más agresiva.

3

Puede experimentar este problema en diferentes casos de uso. Para mí, como olvidé poner el signo de dólar ($) antes del parámetro dentro de mi función, , por lo que el procesador piensa que estoy usando una etiqueta de nodo sin indicar contexto, entonces aparece este error. Simplemente necesito poner $ antes de mi param. Espero que mi solución sea útil para los demás.

Cuestiones relacionadas