2012-04-10 15 views
6

Wir verwenden Altova Stylevision, das XSLT 2.0-Dateien erzeugt. Wir verwenden Saxon 9 für Java, um diese XSLT-Dateien auszuführen. Das funktioniert seit einigen Jahren gut, leider versteht keiner von uns XSLT. JetztXSLT 2.0 erzeugt Fehler: "Das Kontextelement ist nicht definiert"

wir haben den Fehler:

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

Die 9. Funktion:

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

Hat jemand eine Ahnung, was los ist?

Antwort

8

Das Problem ist, dass der Funktionspfad Ausdrücke wie item verwendet, die einen Kontextelement als the specification mandates „im Körper einer Sheet Funktion benötigen, ist der Fokus zunächst undefiniert, was bedeutet, daß jeder Versuch, das Kontextelement zu verweisen, Kontextposition oder Kontextgröße ist ein nicht behebbarer dynamischer Fehler. [XPDY0002] ". Die Funktion muss also einen Parameter haben, der den Knoten oder die Sequenz von Knoten durchlässt, auf die der Pfad angewendet werden soll, z.

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

und dann mit z. sps:GoogleChartDataSourceUnitCount(.).

Wenn das Stylesheet von einem Altova-Tool generiert wird, können Sie unter Altova forums nachfragen, ob dies ein bekanntes Problem ist und ob ein Fix verfügbar ist.

7

Laut der W3C XSLT 2.0 specification ist der anfängliche Kontextartikel für eine xsl:function nicht definiert.

Dies bedeutet, dass innerhalb des Funktionskörpers jeder Verweis auf Daten (Elemente) nur aus Parametern (übergeben oder global) oder Variablen erfolgen kann.

Das Problem ist, dass ein Ausdruck in dem bereitgestellten Code beginnt mit:

concat(string-join(item ... 

und diese verletzt eindeutig die obige Regel - item ein Kontextelement referenziert ausgeschaltet ist, die sich innerhalb von nicht erlaubt ist ein xsl:function.

Die Lösung:

  1. Geben Sie das beabsichtigte Kontextelement als Parameter (empfohlen) sagt pDoc genannt, oder einen globale Variable/Parameter das beabsichtigten Kontextelement enthalten.

  2. Referenz Artikel in der ersten Stelle Schritt eines XPath-Ausdruck aus, dass die Parameter/Variable, zum Beispiel $pDoc/item

FAQ: Warum ist diese Einschränkung?

Antwort: Wenn ein implizites initiales Kontextelement nicht zugelassen wird, kann der XSLT-Prozessor eine umfangreichere statische Analyse durchführen und den Code viel aggressiver optimieren.

3

Dieses Problem kann bei verschiedenen Anwendungsfällen auftreten. Für mich, da ich vergessen habe, Dollar ($) Zeichen vor dem Parameter in meiner Funktion, setzen, so dass der Prozessor denkt, dass ich eine Node-Tag ohne Angabe Kontext verwenden, dann gibt diesen Fehler. Ich muss einfach $ vor meinen param setzen. Hoffe, dass meine Lösung für andere hilfreich ist.