Megosztás a következőn keresztül:


Szkriptblokkok msxsl:script használatával

Feljegyzés

A szkriptblokkok csak .NET-keretrendszer támogatottak. A .NET Core vagy a .NET 5 vagy újabb verziók nem támogatják őket.

Az XslCompiledTransform osztály támogatja a beágyazott szkripteket az msxsl:script elem használatával. A stíluslap betöltésekor a program a definiált függvényeket a Code Document Object Model (CodeDOM) által közös köztes nyelvre (CIL) fordítja le, és futtatás közben hajtja végre. A beágyazott szkriptblokkból létrehozott szerelvény külön van, mint a stíluslaphoz létrehozott szerelvény.

XSLT-szkript engedélyezése

A beágyazott szkriptek támogatása az osztály opcionális XSLT-beállítása XslCompiledTransform . A szkriptek támogatása alapértelmezés szerint le van tiltva. A szkript támogatásának engedélyezéséhez hozzon létre egy XsltSettings objektumot, amelynek a EnableScript tulajdonsága a metódushoz true van állítva, és adja át az objektumot.Load

Feljegyzés

Az XSLT-szkriptek csak akkor engedélyezhetők, ha szkripttámogatást igényel, és teljes mértékben megbízható környezetben dolgozik.

msxsl:script Elemdefiníció

Az msxsl:script elem egy Microsoft-bővítmény az XSLT 1.0-s javaslathoz, és a következő definícióval rendelkezik:

<msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script>

Az msxsl előtag az urn:schemas-microsoft-com:xslt URI névtérhez van kötve. A stíluslapnak tartalmaznia kell a névtér deklarációját xmlns:msxsl=urn:schemas-microsoft-com:xslt .

Az language attribútum nem kötelező. Értéke a beágyazott kódblokk kódnyelve. A nyelv a megfelelő CodeDOM-fordítóhoz van leképezve a CodeDomProvider.CreateProvider metódus használatával. Az XslCompiledTransform osztály bármilyen Microsoft .NET-nyelvet támogat, feltéve, hogy a megfelelő szolgáltató telepítve van a gépen, és regisztrálva van a machine.config fájl system.codedom szakaszában. Ha nincs language megadva attribútum, a nyelv alapértelmezés szerint JScript lesz. A nyelv neve nem megkülönbözteti a kis- és nagybetűket, ezért a "JavaScript" és a "javascript" egyenértékű.

Az implements-prefix attribútum kötelező. Ez az attribútum egy névtér deklarálásához és a szkriptblokkhoz való társításához használható. Ennek az attribútumnak az értéke a névteret jelképező előtag. Ez az előtag definiálható valahol egy stíluslapon.

Feljegyzés

Az elem használatakor msxsl:script erősen javasoljuk, hogy a szkript nyelvtől függetlenül egy CDATA-szakaszban legyen elhelyezve. Mivel a szkript tartalmazhat operátorokat, azonosítókat vagy elválasztójeleket egy adott nyelvhez, ha nem szerepel egy CDATA-szakaszban, akkor xml-ként való félreértelmezhető. Az alábbi XML a CDATA szakasz egy sablonját jeleníti meg, ahol a kód elhelyezhető.

<msxsl:script implements-prefix='your-prefix' language='CSharp'>
<![CDATA[
// Code block.
]]>
</msxsl:script>

Szkriptfüggvények

A függvények deklarálhatók az elemen msxsl:script belül. Ha egy függvény deklarálva van, az egy szkriptblokkban található. A stíluslapok több szkriptblokkot tartalmazhatnak, amelyek mindegyike független a másiktól. Ez azt jelenti, hogy ha szkriptblokkon belül hajt végre, akkor nem hívhat meg egy másik szkriptblokkban definiált függvényt, kivéve, ha a rendszer ugyanazt a névteret és ugyanazt a szkriptnyelvet deklarálja. Mivel minden szkriptblokk a saját nyelvén is lehet, és a blokk az adott nyelvelemző nyelvhelyességi szabályainak megfelelően van elemezve, javasoljuk, hogy a használt nyelv megfelelő szintaxisát használja. Ha például Microsoft C#-szkriptblokkban van, használja a C# megjegyzésszintaxisát.

A megadott argumentumok és a függvénynek visszaadott értékek bármilyen típusúak lehetnek. Mivel a W3C XPath-típusok a közös nyelvi futtatókörnyezet (CLR) típusok részhalmazai, a típusátalakítás olyan típusok esetében történik, amelyek nem tekinthetők XPath-típusnak. Az alábbi táblázat a megfelelő W3C-típusokat és az azzal egyenértékű CLR-típust mutatja be.

W3C-típus CLR-típus
String String
Boolean Boolean
Number Double
Result Tree Fragment XPathNavigator
Node Set XPathNodeIterator

A CLR-numerikus típusok konvertálva lesznek Double. A DateTime típust a rendszer átalakítja String. IXPathNavigable típusok lesznek konvertálva XPathNavigator. Az XPathNavigator[] átalakítva .XPathNodeIterator

Minden más típus hibát jelez.

Névterek és szerelvények importálása

Az XslCompiledTransform osztály előre definiálja az elem által msxsl:script alapértelmezés szerint támogatott szerelvényeket és névtereket. Az előre definiált listán nem szereplő névtérhez tartozó osztályokat és tagokat azonban használhatja a blokk szerelvényének és névterének msxsl:script importálásával.

Szerelvények

A rendszer alapértelmezés szerint a következő két szerelvényre hivatkozik:

  • System.dll

  • System.Xml.dll

  • Microsoft.VisualBasic.dll (ha a szkript nyelve VB)

Az elem használatával msxsl:assembly importálhatja a további szerelvényeket. Ez magában foglalja a szerelvényt a stíluslap fordításakor. Az msxsl:assembly elem definíciója a következő:

<msxsl:script>
  <msxsl:assembly name="system.assemblyName" />
  <msxsl:assembly href="path-name" />
    <![CDATA[
    // User code
    ]]>
</msxsl:script>

Az name attribútum tartalmazza a szerelvény nevét, az href attribútum pedig a szerelvény elérési útját. A szerelvény neve lehet teljes név, például "System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" vagy egy rövid név, például a "System.Web".

Névterek

Alapértelmezés szerint a következő névterek szerepelnek:

  • Rendszer

  • System.Collection

  • System.Text

  • System.Text.RegularExpressions

  • System.Xml

  • System.Xml.Xsl

  • System.Xml.XPath

  • Microsoft.VisualBasic (ha a szkript nyelve VB)

Az attribútum használatával namespace további névterekhez is hozzáadhat támogatást. Az attribútum értéke a névtér neve.

<msxsl:script>
  <msxsl:using namespace="system.namespaceName" />
    <![CDATA[
    // User code
    ]]>
</msxsl:script>

Példa

Az alábbi példa beágyazott szkripttel számítja ki egy kör kerületét a sugara alapján.

using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;

public class Sample {

  private const String filename = "number.xml";
  private const String stylesheet = "calc.xsl";

  public static void Main() {

    // Compile the style sheet.
    XsltSettings xslt_settings = new XsltSettings();
    xslt_settings.EnableScript = true;
    XslCompiledTransform xslt = new XslCompiledTransform();
    xslt.Load(stylesheet, xslt_settings, new XmlUrlResolver());

    // Load the XML source file.
    XPathDocument doc = new XPathDocument(filename);

    // Create an XmlWriter.
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;
    settings.Indent = true;
    XmlWriter writer = XmlWriter.Create("output.xml", settings);

    // Execute the transformation.
    xslt.Transform(doc, writer);
    writer.Close();
  }
}
Imports System.IO
Imports System.Xml
Imports System.Xml.XPath
Imports System.Xml.Xsl

Public class Sample

    Private Const filename As String = "number.xml"
    Private Const stylesheet As String = "calc.xsl"

    Public Shared Sub Main()

        ' Compile the style sheet.
        Dim xslt_settings As XsltSettings = New XsltSettings()
        xslt_settings.EnableScript = true
        Dim xslt As XslCompiledTransform = New XslCompiledTransform()
        xslt.Load(stylesheet, xslt_settings, New XmlUrlResolver())

        ' Load the XML source file.
        Dim doc As XPathDocument = New XPathDocument(filename)

        ' Create an XmlWriter.
        Dim settings As XmlWriterSettings = New XmlWriterSettings()
        settings.OmitXmlDeclaration = true
        settings.Indent = true
        Dim writer As XmlWriter = XmlWriter.Create("output.xml", settings)

        ' Execute the transformation.
        xslt.Transform(doc, writer)
        writer.Close()
    End Sub
End Class

number.xml

<?xml version='1.0'?>
<data>
  <circle>
    <radius>12</radius>
  </circle>
  <circle>
    <radius>37.5</radius>
  </circle>
</data>

calc.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:user="urn:my-scripts">
  <msxsl:script language="C#" implements-prefix="user">
  <![CDATA[
  public double circumference(double radius){
    double pi = 3.14;
    double circ = pi*radius*2;
    return circ;
  }
  ]]>
  </msxsl:script>
  <xsl:template match="data">
    <circles>
      <xsl:for-each select="circle">
        <circle>
          <xsl:copy-of select="node()"/>
          <circumference>
            <xsl:value-of select="user:circumference(radius)"/>
          </circumference>
        </circle>
      </xsl:for-each>
    </circles>
  </xsl:template>
</xsl:stylesheet>

Hozam

<circles xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts">
  <circle>
    <radius>12</radius>
    <circumference>75.36</circumference>
  </circle>
  <circle>
    <radius>37.5</radius>
    <circumference>235.5</circumference>
  </circle>
</circles>

Lásd még