2010-08-22 1 views
6

eine Funktion von einem xsl verwenden: "one.xsl" und "two.xsl"Wie in anderen

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> 

ich verwenden möchte Funktion "x: trans" in "one.xsl"

Wie referenziere ich die Funktion auf eine andere Datei?


Das Problem ist, dass wenn ich versuche, auf diese Weise für diese Funktion aufzurufen:

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

ich die folgende Fehlermeldung von Browser erhalten:

Verweis auf die nicht angemeldete Namespacepräfix: ‚x '

+0

Wenn Sie "one.xsl" importiert oder hinzugefügt haben, müssen Sie auch den Namensraum "x" in "two.xsl" deklarieren, wenn Sie ihn verwenden möchten. –

+3

Sie erwähnen auch, dass die Nachricht aus den Funktionen * browser * ... custom ** eine XSLT 2.0-Funktion ist **. Derzeit werden keine Browser von XSLT 2.0 unterstützt. Wenn Sie möchten, dass Browser Ihre XSLT ausführen, benötigen Sie eine * XSLT 1.0 * -Lösung. –

+0

Gute Frage (+1). In meiner Antwort finden Sie eine vollständige Schritt-für-Schritt-Erklärung zum Aufrufen einer 'xsl: function'. –

Antwort

1

In two.xsl:

<xsl:include href="one.xsl" /> 

Siehe auch die Beschreibung des Einschlusses in der XSLT 2.0 spec.

4

Sie möchten entweder <xsl:include /> oder <xsl:import />. <xsl:include /> ist einfacher (es schleppt einfach alles hinein), während <xsl:import /> flexibler ist (wenn Vorlagen zwischen den beiden kollidieren, ist die Übersteuerung des Angerufenen durch den Anrufer besser definiert und allgemein sinnvoll).

Bearbeiten für mehr Info:

Sie benötigen Sie den appopriate Namespace, um sicherzustellen, die Vorlagen in der importierten Sheet rufen verwenden. Am einfachsten stellen Sie sicher, dass Sie in den Stylesheets übereinstimmende xmlns: foo-Deklarationen haben, obwohl Sie foo: template in einem Stylesheet als bar: template im anderen aufrufen könnten, wenn es stattdessen xmlns: bar hätte.

+0

+1 Im Allgemeinen bevorzuge ich Import über Include, da es mehr Flexibilität bietet. –

+0

+1 und dito für die Bevorzugung von xsl: import –

+0

Yup! Importieren Sie den ganzen Weg –

7

Neben den richtigen Antworten, die Sie brauchen, um <xsl:include> oder <xsl:import> (ich würde diese als ehemaligen empfehlen kann oft in Doppelfehlern), Ihr anderes Problem ist folgende:

  1. Ein Funktionsname muss zu einem Namespace gehören.

  2. Der Namespace muss in der gleichen Datei, in der die Funktion definiert ist, (definiert und an ein Präfix gebunden) angegeben werden.

  3. Jeder Aufruf der Funktion hat den Namen der Funktion und das Präfix voranstellen müssen, zu dem der Name der Funktion gehört

Hier ist ein einfaches Beispiel zu gleichen Namensraum gebunden werden:

I.Datei deleteA.xsl definiert die Funktion 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. Die Datei deleteB.xsl Importe Datei deleteA.xsl und verwendet die Funktion 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. Die Transformation in deleteB.xsl sich auf den folgenden XML-Dokument angewendet:

<t>1</t> 

und das richtige Ergebnis wird hergestellt:

2 

Zusätzliche Kommentar: Derzeit kein Browser XSLT 2.0 unterstützt Transformationen - xsl:function ist nur in XSLT 2.0 + verfügbar.

Verwandte Themen