2012-04-10 7 views
6

Używamy Altova Stylevision, która tworzy pliki XSLT 2.0. Używamy Saxon 9 dla Java, aby wykonać te pliki XSLT. To działa dobrze od kilku lat, niestety żaden z nas nie rozumie XSLT.XSLT 2.0 generuje błąd: "element kontekstowy jest niezdefiniowany"

Teraz mamy błąd:

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

The 9th funkcji jest następująca:

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

Czy ktoś ma jakiś pomysł, co się dzieje?

Odpowiedz

8

Problemem jest to, że funkcja używa wyrażeń ścieżki jak item które wymagają element kontekście jako the specification mandates „W ciele funkcji arkusza stylów, koncentruje się początkowo nieokreślony, co oznacza, że ​​każda próba odniesienia element kontekstu, pozycja kontekst lub rozmiar kontekstu jest nieodwracalnym błędem dynamicznym. [XPDY0002] ". Tak więc funkcja musi mieć parametr, który przechodzi w węźle lub sekwencji węzłów, do których ścieżka powinna zostać zastosowana, np.

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

, a następnie musi zostać wywołana za pomocą np. sps:GoogleChartDataSourceUnitCount(.).

Jeśli arkusz stylów jest generowany przez niektóre narzędzia z Altova, możesz zapytać w numerze Altova forums, czy jest to znany problem i czy poprawka jest dostępna.

7

Jak na W3C XSLT 2.0 specification początkowa pozycja kontekst dla xsl:function jest niezdefiniowana.

Oznacza to, że w treści funkcji każde odniesienie do danych (elementów) może się zdarzyć tylko w parametrach (przekazanych lub globalnych) lub zmiennych.

Problem polega na tym, że wyrażenie w podanym kodem rozpoczyna:

concat(string-join(item ... 

i to wyraźnie narusza powyższej zasady - item odwołuje się element kontekstu, co nie jest dozwolone wewnątrz xsl:function.

Rozwiązanie:

  1. Przepuścić zamierzony element kontekstowy jako parametr (zalecane) mówią o nazwie pDoc lub mieć globalną zmienną/parametr zawierają zamierzony element kontekst.

  2. pozycji odniesienia w pierwszym etapie lokalizacji wyrażenia XPath off tego parametru/zmiennej, na przykład $pDoc/item

FAQ: Dlaczego jest to ograniczenie?

Odpowiedź: Nie pozwalając niejawny początkową pozycję kontekstowe umożliwia procesor XSLT do wykonywania szerszego análisis statyczną i optymalizacji kodu znacznie bardziej agresywnie.

3

Możesz napotkać ten problem w różnych przypadkach użycia. Dla mnie, ponieważ zapomniałem umieścić znak dolara ($) przed parametrem w mojej funkcji, , więc procesor myśli, że używam znacznika node-tag bez wskazania kontekstu, następnie podaje ten błąd. Po prostu muszę umieścić $ przed moim paramem. Mam nadzieję, że moje rozwiązanie będzie pomocne dla innych.