2010-08-22 11 views
6

Mam dwa pliki XSL: "one.xsl" i "two.xsl"Jak korzystać z funkcji z jednego XSL w innym

one.xsl:

<xsl:function name="x:trans" as="xs:string"> 
    <xsl:param name="str"></xsl:param> 
    <xsl:variable name="res1" select="x:translate_string($str)"/> 
    <xsl:sequence select="$res1"/> 
</xsl:function> 
</xsl:stylesheet> 

chcę używać funkcja "x: trans" w "jeden.xsl"

Jak mogę odwołać się do funkcji do innego pliku?


Problemem jest to, że gdy próbuję zadzwonić do tej funkcji w ten sposób:

< xsl:value-of select="x:trans('Hello World')"/> 

pojawia się następujący komunikat o błędzie z przeglądarki:

odniesieniem do nielegalnej namespace prefix: „x "

+0

Jeśli zaimportowałeś lub włączyłeś plik "one.xsl", musisz też zadeklarować przestrzeń nazw "x" w pliku "two.xsl", jeśli chcesz jej użyć. –

+3

Należy również wspomnieć, że wiadomość z funkcji * browser * ... custom ** jest funkcją XSLT 2.0 **. Żadne przeglądarki aktualnie nie obsługują XSLT 2.0. Jeśli chcesz, aby przeglądarki uruchamiały twój XSLT, będziesz potrzebował rozwiązania * XSLT 1.0 *. –

+0

Dobre pytanie (+1). Zobacz moją odpowiedź, aby uzyskać pełne wyjaśnienie krok po kroku, jak wywołać '' xsl: function'. –

Odpowiedz

4

Chcesz albo zrobić <xsl:include /> lub <xsl:import />. <xsl:include /> jest prostszy (po prostu wciąga wszystko), podczas gdy <xsl:import /> jest bardziej elastyczny (jeśli istnieją szablony zderzające się między tymi dwoma, nadmierna jazda wywołanego przez wywołanie jest lepiej zdefiniowana i ogólnie rozsądniejsza).

Edycja dla dodatkowej informacji:

Musisz upewnić się, że nazywają szablony w importowanym arkuszu stylów używając nazw appopriate. Najprostszym sposobem jest upewnienie się, że w arkuszach stylów znajdują się pasujące deklaracje xmlns: foo, ale można nazwać foo: template w jednym arkuszu stylów jako bar: template w drugim, jeśli zamiast niego ma xmlns: bar.

+0

+1 Generalnie preferuję opcję importu przez uwzględnienie, ponieważ zapewnia większą elastyczność. –

+0

+1 i ditto za preferowanie xsl: import –

+0

Yup! Importuj całą drogę –

7

Oprócz poprawnych odpowiedzi, które trzeba <xsl:include> lub <xsl:import> (polecam ten ostatni jako pierwszy może często prowadzić do błędów powielania), Twój drugi problem jest następujący:

  1. Nazwa funkcji musi należeć do przestrzeni nazw.

  2. Przestrzeń nazw musi być zadeklarowana jako (zdefiniowana i związana z prefiksem) w tym samym pliku, w którym zdefiniowano funkcję.

  3. Każde wywołanie funkcji musi poprzedzić nazwę funkcji i że przedrostek muszą być przyłączone do tego samego obszaru nazw noszącego nazwę funkcji należy

Oto prosty przykład:

I.Plik deleteA.xsl określa funkcję my:double

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="my:my" 
    > 
<xsl:function name="my:double" as="xs:double"> 
    <xsl:param name="pArg" as="xs:double"/> 

    <xsl:sequence select="2*$pArg"/> 
</xsl:function> 
</xsl:stylesheet> 

II. File deleteB.xsl import pliku deleteA.xsl i wykorzystuje funkcję my:double:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="my:my"> 
    <xsl:import href="deleteA.xsl"/> 

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:sequence select="my:double(.)"/> 
    </xsl:template> 
</xsl:stylesheet> 

III. Transformacja zawarte w deleteB.xsl nakłada na poniższym dokumencie XML:

<t>1</t> 

i poprawny wynik jest produkowany:

2 

Dodatkowy komentarz: Obecnie żadna przeglądarka nie obsługuje XSLT 2.0 transformacje - xsl:function jest dostępne tylko w XSLT 2.0 +.

Powiązane problemy