msxsl:script を使用したスクリプト ブロックScript Blocks Using msxsl:script

XslCompiledTransform クラスは、msxsl:script 要素を使用した埋め込みスクリプトをサポートしています。The XslCompiledTransform class supports embedded scripts using the msxsl:script element. スタイル シートが読み込まれると、定義されているすべての関数は Code Document Object Model (CodeDOM) によって Microsoft intermediate language (MSIL) にコンパイルされ、実行時に実行されます。When the style sheet is loaded, any defined functions are compiled to Microsoft intermediate language (MSIL) by the Code Document Object Model (CodeDOM) and are executed during run time. 埋め込みのスクリプト ブロックから生成されたアセンブリは、スタイル シートに対して生成されるアセンブリとは区別されます。The assembly generated from the embedded script block is separate than the assembly generated for the style sheet.

XSLT スクリプトの有効化Enable XSLT Script

埋め込みスクリプトのサポートは、XslCompiledTransform クラスではオプションの XSLT 設定です。Support for embedded scripts is an optional XSLT setting on the XslCompiledTransform class. スクリプトのサポートは既定で無効になっています。Script support is disabled by default. スクリプトのサポートを有効にするには、XsltSettings プロパティを EnableScript に設定して true オブジェクトを作成し、そのオブジェクトを Load メソッドに渡します。To enable script support, create an XsltSettings object with the EnableScript property set to true and pass the object to the Load method.

注意

XSLT スクリプトは、スクリプトのサポートが必要であり、完全に信頼された環境で作業している場合のみ有効にします。XSLT scripting should be enabled only if you require script support and you are working in a fully trusted environment.

msxsl:script 要素の定義msxsl:script Element Definition

msxsl:script 要素は XSLT 1.0 勧告に対するマイクロソフトの拡張機能であり、次のように定義されます。The msxsl:script element is a Microsoft extension to the XSLT 1.0 recommendation and has the following definition:

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

msxsl プレフィックスは urn:schemas-microsoft-com:xslt 名前空間 URI に関連付けられています。The msxsl prefix is bound to the urn:schemas-microsoft-com:xslt namespace URI. スタイル シートには xmlns:msxsl=urn:schemas-microsoft-com:xslt という名前空間の宣言が必要です。The style sheet must include the xmlns:msxsl=urn:schemas-microsoft-com:xslt namespace declaration.

language 属性は省略できます。The language attribute is optional. その値は、埋め込みコード ブロックのコード言語です。Its value is the code language of the embedded code block. 言語は CodeDomProvider.CreateProvider メソッドを使用して、適切な CodeDOM コンパイラに対応付けられます。The language is mapped to the appropriate CodeDOM compiler using the CodeDomProvider.CreateProvider method. XslCompiledTransform クラスは、適切なプロバイダーがコンピューターにインストールされ、machine.config ファイルの system.codedom セクションに登録されている限り、任意の Microsoft .NET 言語をサポートできます。The XslCompiledTransform class can support any Microsoft .NET language, assuming the appropriate provider is installed on the machine and is registered in the system.codedom section of the machine.config file. language 属性を指定しない場合、既定の言語は JScript です。If a language attribute is not specified, the language defaults to JScript. 言語名では大文字小文字が区別されないため、"JavaScript" と "javascript" は同じと見なされます。The language name is not case-sensitive so 'JavaScript' and 'javascript' are equivalent.

implements-prefix 属性は必須です。The implements-prefix attribute is mandatory. この属性は、名前空間を宣言し、それをスクリプト ブロックに関連付けるために使用されます。This attribute is used to declare a namespace and associate it with the script block. この属性の値は、名前空間を表すプレフィックスです。The value of this attribute is the prefix that represents the namespace. このプレフィックスは、スタイル シート内の任意の場所で定義できます。This prefix can be defined somewhere in a style sheet.

注意

msxsl:script 要素を使用するときは、どの言語でも、スクリプトを CDATA セクション内に配置することをお勧めします。When using the msxsl:script element, we strongly recommend that the script, regardless of language, be placed inside a CDATA section. スクリプトは、その言語で使用する演算子、識別子、または区切り記号を含むことがあり、CDATA セクション内に配置しないと、誤って XML として解釈される可能性があります。Because the script can contain operators, identifiers, or delimiters for a given language, if it is not contained within a CDATA section, it has the potential of being misinterpreted as XML. 次の XML は、コードを配置できる CDATA セクションのテンプレートです。The following XML shows a template of the CDATA section where code can be placed.

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

スクリプト関数Script Functions

関数は、msxsl:script 要素内で宣言できます。Functions can be declared within the msxsl:script element. 関数が宣言されると、その関数はスクリプト ブロックに含まれます。When a function is declared, it is contained in a script block. スタイル シートには、相互に独立して機能する複数のスクリプト ブロックを含めることができます。Style sheets can contain multiple script blocks, each operating independent of the other. このため、1 つのスクリプト ブロック内で実行しているときに、別のスクリプト ブロックで定義した関数を呼び出すことはできません。ただし、そのブロックが同じ名前空間とスクリプト言語を持つように宣言されている場合は例外です。That means that if you are executing inside a script block, you cannot call a function that you defined in another script block unless it is declared to have the same namespace and the same scripting language. 各スクリプト ブロックは独自の言語で記述でき、ブロックはその言語に対応するパーサーの文法規則に従って解析されるため、使われている言語の正しい構文を使用することを推奨します。Because each script block can be in its own language, and the block is parsed according to the grammar rules of that language parser we recommend that you use the correct syntax for the language in use. たとえば、Microsoft C# スクリプト内では C# のコメント構文を使用します。For example, if you are in a Microsoft C# script block, use the C# comment syntax.

関数に渡される引数と戻り値の型は任意です。The supplied arguments and return values to the function can be of any type. W3C XPath 型は共通言語ランタイム (CLR) 型のサブセットなので、XPath 型とは考えられない型については型変換が行われます。Because the W3C XPath types are a subset of the common language runtime (CLR) types, type conversion takes place on types that are not considered to be an XPath type. W3C 型と等価な CLR 型を次の表に示します。The following table shows the corresponding W3C types and the equivalent CLR type.

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

CLR 数値型は Double に変換されます。CLR numeric types are converted to Double. DateTime 型は String に変換されます。The DateTime type is converted to String. IXPathNavigable 型は XPathNavigator に変換されます。IXPathNavigable types are converted to XPathNavigator. XPathNavigator[]XPathNodeIterator に変換されます。XPathNavigator[] is converted to XPathNodeIterator.

その他の型はエラーになります。All other types throw an error.

名前空間とアセンブリのインポートImporting Namespaces and Assemblies

XslCompiledTransform クラスには、既定で msxsl:script 要素がサポートする一連のアセンブリと名前空間が事前定義されています。The XslCompiledTransform class predefines a set of assemblies and namespaces that are supported by default by the msxsl:script element. しかし、アセンブリと名前空間を msxsl:script ブロックにインポートすることにより、事前定義の一覧にない 1 つの名前空間に属するクラスとメンバーを使用することができます。However, you can use classes and members belonging to a namespace that is not on the predefined list by importing the assembly and namespace in msxsl:script block.

アセンブリAssemblies

次の 2 つのアセンブリは既定で参照されます。The following two assemblies are referenced by default:

  • System.dllSystem.dll

  • System.Xml.dllSystem.Xml.dll

  • Microsoft.VisualBasic.dll (スクリプト言語が VB の場合)Microsoft.VisualBasic.dll (when the script language is VB)

msxsl:assembly 要素を使用して、追加のアセンブリをインポートすることができます。You can import the additional assemblies using the msxsl:assembly element. これには、スタイル シートがコンパイルされたときのアセンブリも含まれます。This includes the assembly when the style sheet is compiled. msxsl:assembly 要素は、次のように定義されます。The msxsl:assembly element has the following definition:

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

name 属性にはアセンブリの名前が含まれ、href 属性にはアセンブリへのパスが含まれます。The name attribute contains the name of the assembly and the href attribute contains the path to the assembly. アセンブリの名前は "System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" などの完全な名前でも、"System.Web" などの短い名前でもかまいません。The assembly name can be a full name, such as "System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", or a short name, such as "System.Web".

名前空間Namespaces

次の名前空間は既定で含まれます。The following namespaces are included by default:

  • システムSystem

  • System.CollectionSystem.Collection

  • System.TextSystem.Text

  • System.Text.RegularExpressionsSystem.Text.RegularExpressions

  • System.XmlSystem.Xml

  • System.Xml.XslSystem.Xml.Xsl

  • System.Xml.XPathSystem.Xml.XPath

  • Microsoft.VisualBasic (スクリプト言語が VB の場合)Microsoft.VisualBasic (when the script language is VB)

namespace 属性を使用して、追加の名前空間のサポートを追加することができます。You can add support for additional namespaces using the namespace attribute. 属性値は名前空間の名前です。The attribute value is the name of the namespace.

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

Example

埋め込みスクリプトを使用して、半径が指定された円の円周を算出する例を次に示します。The following example uses an embedded script to calculate the circumference of a circle given its radius.

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
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.xmlnumber.xml

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

calc.xslcalc.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>

出力Output

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

参照See Also

XSLT 変換XSLT Transformations
動的なソース コードの生成とコンパイルDynamic Source Code Generation and Compilation