<msxsl:script> を使用した XSLT スタイルシートのスクリプトXSLT Stylesheet Scripting Using <msxsl:script>

XslTransform クラスは、script 要素を使用した埋め込みスクリプトをサポートしています。The XslTransform class supports embedded scripting using the script element.

注意

.NET Framework 2.0 では XslTransform クラスが廃止されています。The XslTransform class is obsolete in the .NET Framework 2.0. XslCompiledTransform クラスを使用して XSLT (Extensible Stylesheet Language for Transformations) 変換を実行できます。You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the XslCompiledTransform class. 詳しくは、「XslCompiledTransform クラスの使用」および「XslTransform クラスからの移行」をご覧ください。See Using the XslCompiledTransform Class and Migrating From the XslTransform Class for more information.

XslTransform クラスは、script 要素を使用した埋め込みスクリプトをサポートしています。The XslTransform class supports embedded scripting using the script element. スタイル シートが読み込まれると、定義されているすべての関数がクラス定義でラップされることによって Microsoft Intermediate Language (MSIL) にコンパイルされるため、パフォーマンスが低下しません。When the style sheet is loaded, any defined functions are compiled to Microsoft intermediate language (MSIL) by being wrapped in a class definition and have no performance loss as a result.

<msxsl:script> 要素は、次のように定義されます。The <msxsl:script> element is defined below:

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

msxsl は、名前空間 urn:schemas-microsoft-com:xslt に関連付けられたプレフィックスです。where msxsl is a prefix bound to the namespace urn:schemas-microsoft-com:xslt.

language 属性は必須ではありませんが、指定する場合は、値を C#VBJScriptJavaScriptVisualBasicCSharp のいずれかにする必要があります。The language attribute is not mandatory, but if specified, its value must be one of the following: C#, VB, JScript, JavaScript, VisualBasic, or CSharp. language 属性を指定しない場合、既定の言語は JScript です。If not specified, the language defaults to JScript. language-name では大文字小文字が区別されないため、"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 namespace can be defined somewhere in a style sheet.

msxsl:script 要素は名前空間 urn:schemas-microsoft-com:xslt に属しているため、スタイル シートには、名前空間宣言 xmlns:msxsl=urn:schemas-microsoft-com:xslt が含まれている必要があります。Because the msxsl:script element belongs to the namespace urn:schemas-microsoft-com:xslt, the style sheet must include the namespace declaration xmlns:msxsl=urn:schemas-microsoft-com:xslt.

スクリプトの呼び出し元が SecurityPermissionFlag へのアクセス許可を持っていない場合は、スタイル シート内のスクリプトがコンパイルされず、Load への呼び出しが失敗します。If the caller of the script does not have SecurityPermissionFlag access permission, then the script in a style sheet will never compile and the call to Load will fail.

呼び出し元が UnmanagedCode へのアクセス許可を持っている場合、スクリプトはコンパイルされますが、許可される操作は、読み込み時に指定される証拠によって異なります。If the caller has UnmanagedCode permission, the script compiles, but the operations that are allowed are dependent on the evidence that is supplied at load time.

XmlReader または XPathNavigator を受け取る Load メソッドを使用してスタイル シートを読み込む場合は、Evidence パラメーターを引数として受け取る Load オーバーロードを使用する必要があります。If you are using one of the Load methods that take an XmlReader or XPathNavigator to load the style sheet, you need to use the Load overload that takes an Evidence parameter as one of its arguments. 証拠を指定する場合、呼び出し元は、スクリプト アセンブリの Evidence を渡すための SecurityPermissionFlag へのアクセス許可を持っている必要があります。To provide evidence, the caller must have SecurityPermissionFlag permission to supply Evidence for the script assembly. 呼び出し元がこのアクセス許可を持っていない場合は、Evidence パラメーターが null に設定されることがあります。If the caller does not have this permission, then they can set the Evidence parameter to null. その場合は、Load 関数がスクリプトを見つけると、処理が失敗します。This causes the Load function to fail if it finds script. ControlEvidence へのアクセス許可は、非常に強力なアクセス権であるため、信頼性の高いコード以外に与えてはいけません。The ControlEvidence permission is considered a very powerful permission that should only be granted to highly trusted code.

アセンブリから証拠を取得するには、this.GetType().Assembly.Evidence を使用します。To get the evidence from your assembly, use this.GetType().Assembly.Evidence. URI (Uniform Resource Identifier) から証拠を取得するには、Evidence e = XmlSecureResolver.CreateEvidenceForUrl(stylesheetURI) を使用します。To get the evidence from a Uniform Resource Identifier (URI), use Evidence e = XmlSecureResolver.CreateEvidenceForUrl(stylesheetURI).

Load を受け取り、XmlResolver を受け取らない Evidence メソッドを使う場合、アセンブリのセキュリティ ゾーンは既定で Full Trust に設定されます。If you use Load methods that take an XmlResolver but no Evidence, the security zone for the assembly defaults to Full Trust. 詳しくは、「SecurityZone」および「名前付き権限セット」をご覧ください。For more information, see SecurityZone and Named Permission Sets.

関数は、msxsl:script 要素内で宣言できます。Functions can be declared within the msxsl:script element. 既定でサポートされる名前空間を次の表に示します。The following table shows the namespaces that are supported by default. 表に示す名前空間の外側でもクラスを使用できます。You can use classes outside the listed namespaces. ただし、これらのクラスには、完全修飾名が指定されている必要があります。However, these classes must be fully qualified.

既定の名前空間Default Namespaces 説明Description
システムSystem システム クラスSystem class.
System.CollectionSystem.Collection コレクション クラスCollection classes.
System.TextSystem.Text テキスト クラスText classes.
System.Text.RegularExpressionsSystem.Text.RegularExpressions 正規表現クラスRegular expression classes.
System.XmlSystem.Xml コア XML クラスCore XML classes.
System.Xml.XslSystem.Xml.Xsl XSLT クラスXSLT classes.
System.Xml.XPathSystem.Xml.XPath XPath (XML Path Language) クラスXML Path Language (XPath) classes.
Microsoft.VisualBasicMicrosoft.VisualBasic Microsoft Visual Basic スクリプト用のクラス。Classes for Microsoft Visual Basic scripts.

関数が宣言されると、その関数はスクリプト ブロックに含まれます。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, you must use the correct syntax for the language in use. たとえば、C# スクリプト ブロック内で XML コメント ノード <!-- an XML comment --> を使用すると、エラーが発生します。For example, if you are in a C# script block, then it is an error to use an XML comment node <!-- an XML comment --> in the block.

スクリプト関数で定義されている引数および戻り値は、W3C (World Wide Web Consortium) XPath 型または XSLT 型のいずれかである必要があります。The supplied arguments and return values defined by the script functions must be one of the World Wide Web Consortium (W3C) XPath or XSLT types. 対応する W3C 型、それと同等の .NET Framework のクラス (型)、および W3C 型が XPath 型または XSLT 型のどちらかを次の表に示します。The following table shows the corresponding W3C types, the equivalent .NET Framework classes (Type), and whether the W3C type is an XPath type or XSLT type.

Type 対応する .NET Framework クラス (型)Equivalent .NET Framework Class (Type) XPath 型または XSLT 型XPath type or XSLT type
StringString System.StringSystem.String XPathXPath
ブール型Boolean System.BooleanSystem.Boolean XPathXPath
数値Number System.DoubleSystem.Double XPathXPath
Result Tree FragmentResult Tree Fragment System.Xml.XPath.XPathNavigatorSystem.Xml.XPath.XPathNavigator XSLTXSLT
Node SetNode Set System.Xml.XPath.XPathNodeIteratorSystem.Xml.XPath.XPathNodeIterator XPathXPath

スクリプト関数が数値型Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、または Decimal を使用する場合、これらの数値型は、W3C XPath 数値型に対応する Double に強制的に変換されます。If the script function utilizes one of the following numeric types: Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, or Decimal, they are forced to Double, which maps to the W3C XPath type number. その他の型はすべて、ToString メソッドを呼び出して強制的に文字列に変換されます。All other types are forced to a string by calling the ToString method.

スクリプト関数が上記以外の型を使用したり、スタイル シートが XslTransform オブジェクトに読み込まれるときにスクリプト関数がコンパイルを実行しなかったりすると、例外がスローされます。If the script function utilizes a type other than the ones mentioned above, or if the function does not compile when the style sheet is loaded into the XslTransform object, an exception is thrown.

msxsl:script 要素を使うときは、言語に関係なく、スクリプトを CDATA セクション内に配置することをお勧めします。When using the msxsl:script element, it is highly recommended that the script, regardless of language, be placed inside a CDATA section. コードが配置されている CDATA セクションのテンプレートを示す XML の例を次に示します。For example, the following XML shows the template of the CDATA section where your code is placed.

<msxsl:script implements-prefix='yourprefix' language='CSharp'>  
    <![CDATA[  
    ... your code here ...  
    ]]>  
</msxsl:script>  

特定の言語の演算子、識別子、または区切り記号が誤って XML として解釈される可能性があるため、スクリプトのすべての内容を CDATA セクション内に配置することをお勧めします。It is highly recommended that all script content be placed in a CDATA section, because operators, identifiers, or delimiters for a given language have the potential of being misinterpreted as XML. スクリプトで論理 AND 演算子を使用する例を次に示します。The following example shows the use of the logical AND operator in script.

<msxsl:script implements-prefix='yourprefix' language='CSharp'>  
    public string book(string abc, string xyz)  
    {  
        if ((abc == bar) && (abc == xyz)) return bar + xyz;  
        else return null;  
    }  
</msxsl:script>  

この例では、アンパサンドがエスケープされないため、結果として例外がスローされます。This throws an exception because the ampersands are not escaped. このドキュメントは XML として読み込まれ、msxsl:script 要素タグ間にあるテキストに対して特別な処理は適用されません。The document is loaded as XML, and no special treatment is applied to the text between the msxsl:script element tags.

Example

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

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()  
  
    'Create the XslTransform and load the style sheet.  
    Dim xslt As XslTransform = New XslTransform  
    xslt.Load(stylesheet)  
  
    'Load the XML data file.  
    Dim doc As XPathDocument = New XPathDocument(filename)  
  
    'Create an XmlTextWriter to output to the console.
    Dim writer As XmlTextWriter = New XmlTextWriter(Console.Out)  
    writer.Formatting = Formatting.Indented  
  
    'Transform the file.  
    xslt.Transform(doc, Nothing, writer, Nothing)  
    writer.Close()  
  End Sub
End Class  
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()  
   {  
    //Create the XslTransform and load the style sheet.  
    XslTransform xslt = new XslTransform();  
    xslt.Load(stylesheet);  
  
    //Load the XML data file.  
    XPathDocument doc = new XPathDocument(filename);  
  
    //Create an XmlTextWriter to output to the console.
    XmlTextWriter writer = new XmlTextWriter(Console.Out);  
    writer.Formatting = Formatting.Indented;  
  
    //Transform the file.  
    xslt.Transform(doc, null, writer, null);  
    writer.Close();  
  }  
}  

入力Input

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