Bloky skriptu používající element msxsl:script

Poznámka:

Bloky skriptů jsou podporovány pouze v rozhraní .NET Framework. Nejsou podporovány v .NET Core nebo .NET 5 nebo novější.

Třída XslCompiledTransform podporuje vložené skripty pomocí elementu msxsl:script . Při načtení šablony stylů se všechny definované funkce kompilují do společného zprostředkujícího jazyka (CIL) modelem objektu dokumentu kódu (CodeDOM) a spustí se během běhu. Sestavení vygenerované z bloku vloženého skriptu je oddělené od sestavení generovaného pro šablonu stylů.

Povolení skriptu XSLT

Podpora vložených skriptů je volitelné nastavení XSLT ve XslCompiledTransform třídě. Podpora skriptů je ve výchozím nastavení zakázaná. Chcete-li povolit podporu skriptu, vytvořte XsltSettings objekt s vlastností nastavenou EnableScript na true a předejte objekt metodě Load .

Poznámka:

Skriptování XSLT by mělo být povolené jenom v případě, že potřebujete podporu skriptů a pracujete v plně důvěryhodném prostředí.

msxsl:script – definice elementu

Element msxsl:script je rozšíření Microsoftu pro doporučení XSLT 1.0 a má následující definici:

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

Předpona msxsl je vázána urn:schemas-microsoft-com:xslt na identifikátor URI oboru názvů. Šablona stylů musí obsahovat xmlns:msxsl=urn:schemas-microsoft-com:xslt deklaraci oboru názvů.

Atribut language je nepovinný. Jeho hodnota je jazyk kódu vloženého bloku kódu. Jazyk je mapován na příslušný kompilátor CodeDOM pomocí CodeDomProvider.CreateProvider metody. Třída XslCompiledTransform může podporovat libovolný jazyk Microsoft .NET za předpokladu, že je na počítači nainstalován příslušný zprostředkovatel a je registrován v části system.codedom souboru machine.config. language Pokud atribut není zadaný, jazyk se ve výchozím nastavení nastaví na JScript. V názvu jazyka se nerozlišují malá a velká písmena, takže javascript a javascript jsou ekvivalentní.

Atribut implements-prefix je povinný. Tento atribut slouží k deklaraci oboru názvů a jeho přidružení k bloku skriptu. Hodnota tohoto atributu je předpona, která představuje obor názvů. Tuto předponu lze definovat někde v šabloně stylů.

Poznámka:

Při použití elementu msxsl:script důrazně doporučujeme, aby se skript bez ohledu na jazyk umístil do oddílu CDATA. Protože skript může obsahovat operátory, identifikátory nebo oddělovače pro daný jazyk, pokud není obsažen v oddílu CDATA, může být chybně interpretován jako XML. Následující XML ukazuje šablonu oddílu CDATA, kde lze umístit kód.

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

Funkce skriptů

Funkce lze deklarovat v rámci elementu msxsl:script . Když je funkce deklarována, je obsažena v bloku skriptu. Šablony stylů můžou obsahovat více bloků skriptů, z nichž každá funguje nezávisle na druhém. To znamená, že pokud spouštíte uvnitř bloku skriptu, nemůžete volat funkci, kterou jste definovali v jiném bloku skriptu, pokud není deklarována tak, aby měla stejný obor názvů a stejný skriptovací jazyk. Vzhledem k tomu, že každý blok skriptu může být ve vlastním jazyce a blok se parsuje podle gramatických pravidel daného analyzátoru jazyka, doporučujeme použít správnou syntaxi pro jazyk, který se používá. Pokud jste například v bloku skriptu Microsoft C#, použijte syntaxi komentáře jazyka C#.

Zadané argumenty a návratové hodnoty funkce mohou být libovolného typu. Vzhledem k tomu, že typy W3C XPath jsou podmnožinou typů modulu CLR (Common Language Runtime), převod typů se provádí u typů, které nejsou považovány za typ XPath. Následující tabulka uvádí odpovídající typy W3C a ekvivalentní typ CLR.

Typ W3C Typ CLR
String String
Boolean Boolean
Number Double
Result Tree Fragment XPathNavigator
Node Set XPathNodeIterator

Číselné typy CLR se převedou na Double. Typ DateTime je převeden na String. IXPathNavigable typy jsou převedeny na XPathNavigator. XPathNavigator[] je převeden na XPathNodeIterator.

Všechny ostatní typy vyvolá chybu.

Import oborů názvů a sestavení

Třída XslCompiledTransform předdefinuje sadu sestavení a oborů názvů, které jsou ve výchozím nastavení podporovány elementem msxsl:script . Můžete však použít třídy a členy patřící do oboru názvů, který není v předdefinovaném seznamu importem sestavení a oboru názvů v msxsl:script bloku.

Sestavení

Ve výchozím nastavení jsou odkazována na následující dvě sestavení:

  • System.dll

  • System.Xml.dll

  • Microsoft.VisualBasic.dll (pokud je jazyk skriptu VB)

Další sestavení můžete importovat pomocí elementu msxsl:assembly . To zahrnuje sestavení při kompilaci šablony stylů. Element msxsl:assembly má následující definici:

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

Atribut name obsahuje název sestavení a href atribut obsahuje cestu k sestavení. Název sestavení může být úplný název, například System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 nebo krátký název, například System.Web.

Obory názvů

Ve výchozím nastavení jsou zahrnuty následující obory názvů:

  • Systémový

  • System.Collection

  • System.Text

  • System.Text.RegularExpressions

  • System.Xml

  • System.xml.xsl

  • System.Xml.XPath

  • Microsoft.VisualBasic (pokud je jazyk skriptu VB)

Pomocí atributu namespace můžete přidat podporu dalších oborů názvů. Hodnota atributu je název oboru názvů.

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

Příklad

Následující příklad používá vložený skript k výpočtu obvodu kruhu vzhledem k jeho poloměru.

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>

Výstup

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

Viz také