MSXSL-Skripts für XSLT
Das Element <msxsl:script> enthält benutzerdefinierte Funktionen und Variablen, die von XPath-Ausdrücken im XSLT-Stylesheet aufgerufen werden können. Das Element <msxsl:script> ist ein Element der obersten Ebene, d.h. es muss ein Child-Element von <xsl:stylesheet> oder <xsl:transform> sein.
Das Element <msxsl:script> muss sich im Namespace urn:schemas-microsoft-com:xslt (siehe Beispiel unten) befinden.
Scripting-Sprache und Namespace
Die im Block verwendete Scripting-Sprache wird im Attribut language des Elements <msxsl:script> definiert und der für Funktionsaufrufe von XPath-Ausdrücken aus zu verwendende Namespace wird durch das Attribut implements-prefix (siehe unten) identifiziert.
<msxsl:script language="scripting-language implements-prefix="user-namespace-prefix">
function-1 or variable-1
...
function-n or variable-n
</msxsl:script>
Das Element <msxsl:script> interagiert mit der Windows Scripting Runtime. Daher können nur Sprachen, die auf Ihrem Rechner installiert sind, im Element <msxsl:script> verwendet werden. Um MXSL Scripts verwenden zu können muss die Plattform .NET Framework 2.0 oder höher installiert sein. Folglich können die .NET Scripting Sprachen innerhalb des Elements <msxsl:script> verwendet werden.
Das Attribut language akzeptiert dieselben Werte wie das Attribut language des HTML <script> Elements. Wenn das Attribut language nicht definiert ist, wird als Standardsprache Microsoft JScript verwendet.
Das Attribut implements-prefix erhält einen Wert, der ein Präfix eines deklarierten in-scope Namespace ist. Bei diesem Namespace handelt es sich normalerweise um einen Benutzer-Namespace, der für eine Funktionsbibliothek reserviert ist. Alle Funktionen und Variablen, die im Element <msxsl:script> definiert sind, werden sich im Namespace befinden, der durch das im Attribut implements-prefix definierte Präfixe identifiziert wird. Wenn eine Funktion von einem XPath-Ausdruck aus aufgerufen wird, muss sich der vollständig qualifizierte Funktionsname im selben Namespace wie die Funktionsdefinition befinden.
Beispiel
Hier sehen Sie ein Beispiel für ein vollständiges XSLT Stylesheet, in dem eine Funktion verwendet wird, die in einem <msxsl:script> Element definiert ist.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://mycompany.com/mynamespace">
<msxsl:script language="VBScript" implements-prefix="user">
<![CDATA[
' Input: A currency value: the wholesale price
' Returns: The retail price: the input value plus 20% margin,
' rounded to the nearest cent
dim a as integer = 13
Function AddMargin(WholesalePrice) as integer
AddMargin = WholesalePrice * 1.2 + a
End Function
]]>
</msxsl:script>
<xsl:template match="/">
<html>
<body>
<p>
<b>Total Retail Price =
$<xsl:value-of select="user:AddMargin(50)"/>
</b>
<br/>
<b>Total Wholesale Price =
$<xsl:value-of select="50"/>
</b>
</p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Datentypen
Die Werte von Parametern, die an und aus dem Script-Block heraus übergeben werden, sind auf XPath-Datentypen beschränkt. Diese Einschränkung gilt nicht für Daten, die zwischen Funktionen und Variablen innerhalb des Script-Blocks übergeben werden.
Assemblies
Eine Assembly kann über das Element msxsl:assembly in das Script importiert werden. Die Assembly wird über einen Namen oder eine URL identifiziert. Die Assembly wird beim Kompilieren des Stylesheet importiert. Hier sehen Sie ein einfaches Beispiel, wie das Element msxsl:assembly zu verwenden ist.
<msxsl:script>
<msxsl:assembly name="myAssembly.assemblyName" />
<msxsl:assembly href="pathToAssembly" />
...
</msxsl:script>
Der Assembly-Name kann ein vollständiger Name sein, wie z.B.:
"system.Math, Version=3.1.4500.1 Culture=neutral PublicKeyToken=a46b3f648229c514"
oder ein Kurzname wie z.B. "myAssembly.Draw".
Namespaces
Namespaces können mit dem Element msxsl:using deklariert werden. Auf diese Art können Assembly-Klassen ohne ihre Namespaces in das Script geschrieben werden, wodurch Sie sich das mühsame Eintippen ersparen. Hier sehen Sie, wie das Element msxsl:using verwendet wird, um Namespaces zu deklarieren.
<msxsl:script>
<msxsl:using namespace="myAssemblyNS.NamespaceName" />
...
</msxsl:script>
Der Wert des namespace Attributs ist der Name des Namespace.