スタイル シート パラメーターと拡張オブジェクト用の XsltArgumentListXsltArgumentList for Style Sheet Parameters and Extension Objects

XsltArgumentList クラスには、XSLT (Extensible Stylesheet Language for Transformations) パラメーターと XSLT 拡張オブジェクトが含まれています。The XsltArgumentList class contains Extensible Stylesheet Language for Transformations (XSLT) parameters and XSLT extension objects. これらのパラメーターと拡張オブジェクトは、Transform メソッドに渡すことで、スタイル シートから呼び出せるようになります。When passed into the Transform method, these parameters and extension objects can be invoked from style sheets.

注意

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

XsltArgumentList クラスには、XSLT パラメーターと XSLT 拡張オブジェクトが含まれています。The XsltArgumentList class contains XSLT parameters and XSLT extension objects. これらのパラメーターと拡張オブジェクトは、Transform メソッドに渡すことで、スタイル シートから呼び出せるようになります。When passed into the Transform method, these parameters and extension objects can be invoked from style sheets.

埋め込みスクリプトを使用するのではなく、オブジェクトを渡す利点を次に示します。The following are advantages to passing an object rather than using an embedded script:

  • クラスをより効果的にカプセル化および再利用できます。Provides better encapsulation and reuse of classes.

  • スタイル シートを小さくすることができ、管理が簡単になります。Allows style sheets to be smaller and more maintainable.

  • サポートされている System 名前空間のセット内で定義されているもの以外の名前空間に属しているクラスのメソッドを呼び出すことができます。Supports calling methods on classes belonging to namespaces other than those defined within the set of supported System namespaces.

  • XPathNodeIterator を使用して結果ツリー フラグメントをスタイル シートに渡す操作がサポートされます。Supports passing result tree fragments to the style sheet with the use of the XPathNodeIterator.

XSLT スタイル シートのパラメーターXSLT Style Sheet Parameters

XSLT パラメーターを XsltArgumentList に追加するには、AddParam メソッドを使用します。XSLT parameters are added to the XsltArgumentList using the AddParam method. パラメーターが追加された時点で、修飾名と名前空間 URI (Uniform Resource Identifier) がそのパラメーター オブジェクトに関連付けられます。A qualified name and namespace Uniform Resource Identifier (URI) are associated with the parameter object at that time.

パラメーター オブジェクトは、W3C (World Wide Web Consortium) 型に対応している必要があります。The parameter object should correspond to a World Wide Web Consortium (W3C) type. 対応する W3C 型、それと同等の .NET Framework のクラス (型)、および W3C 型が XPath (XML Path Language) 型または XSLT 型のどちらであるかを次の表に示します。The following table shows the corresponding W3C types, the equivalent .NET Framework classes (type), and whether the W3C type is an XML Path Language (XPath) type or XSLT type.

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

パラメーター オブジェクトが上に示したクラスでない場合は、クラスの種類に応じて、Double または String に強制的に変換されます。If the parameter object is not one of the above classes, it is forced to either a Double or String, as appropriate. Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Decimal の各型は、強制的に Double に変換されます。Int16, UInt16, Int32, UInt32, Int64, UInt64, Single and Decimal types are forced to a Double. その他すべての型は、ToString メソッドを使用して強制的に文字列に変換されます。All other types are forced to a String using the ToString method.

XSLT パラメーターを使用するために必要な処理To use the XSLT parameter, the user needs to do the following:

  1. XsltArgumentList を作成し、AddParam を使用してオブジェクトを追加します。Create an XsltArgumentList and add the objects using AddParam.

  2. スタイル シートからパラメーターを呼び出します。Call the parameters from the style sheet.

  3. XsltArgumentListTransform メソッドに渡します。Pass the XsltArgumentList to the Transform method.

Example

算出された割引日を保持するパラメーターを AddParam メソッドを使用して作成する例を次に示します。The following example uses the AddParam method to create a parameter to hold a calculated discount date. 割引日は、発注日から 20 日後として算出されます。The discount date is calculated to be 20 days from the order date.

Imports System  
Imports System.IO  
Imports System.Xml  
Imports System.Xml.XPath  
Imports System.Xml.Xsl  
  
Public class Sample  
  
   Private Const filename As String = "order.xml"  
   Private Const stylesheet As String = "discount.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 XsltArgumentList.  
    Dim xslArg As XsltArgumentList = New XsltArgumentList  
  
    'Calculate the discount date.  
    Dim today As DateTime = DateTime.Now  
    Dim d As DateTime = today.AddDays(20)  
    xslArg.AddParam("discount", "", d.ToString())  
  
    'Create an XmlTextWriter to handle the output.  
    Dim writer As XmlTextWriter = New XmlTextWriter("orderout.xml", Nothing)  
  
    'Transform the file.  
    xslt.Transform(doc, xslArg, 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 = "order.xml";  
   private const String stylesheet = "discount.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 XsltArgumentList.  
    XsltArgumentList xslArg = new XsltArgumentList();  
  
    //Calculate the discount date.  
    DateTime today = DateTime.Now;  
    DateTime d = today.AddDays(20);  
    xslArg.AddParam("discount", "", d.ToString());  
  
    //Create an XmlTextWriter to handle the output.  
    XmlTextWriter writer = new XmlTextWriter("orderout.xml", null);  
  
    //Transform the file.  
    xslt.Transform(doc, xslArg, writer, null);  
    writer.Close();  
  }  
}  

入力Input

order.xmlorder.xml

<!--Represents a customer order-->  
<order>  
  <book ISBN='10-861003-324'>  
    <title>The Handmaid's Tale</title>  
    <price>19.95</price>  
  </book>  
  <cd ISBN='2-3631-4'>  
    <title>Americana</title>  
    <price>16.95</price>  
  </cd>  
</order>  

discount.xsldiscount.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <xsl:param name="discount"/>  
  <xsl:template match="/">  
    <order>  
      <xsl:variable name="sub-total" select="sum(//price)"/>  
      <total><xsl:value-of select="$sub-total"/></total>  
      15% discount if paid by: <xsl:value-of select="$discount"/>  
    </order>  
  </xsl:template>  
</xsl:stylesheet>  

OutputOutput

<order>  
   <total>36.9</total>
   15% discount if paid by: 5/6/2001 5:01:15 PM
</order>  

XSLT 拡張オブジェクトXSLT Extension Objects

XSLT 拡張オブジェクトを XsltArgumentList に追加するには、AddExtensionObject メソッドを使用します。XSLT extension objects are added to the XsltArgumentList using the AddExtensionObject method. その時点で、修飾名と名前空間 URI がその拡張オブジェクトに関連付けられます。A qualified name and namespace URI are associated with the extension object at that time.

オブジェクトを追加する場合、AddExtensionObject の呼び出し元は、セキュリティ ポリシーで完全に信頼されている必要があります。When an object is added, the caller of the AddExtensionObject must be fully trusted in the security policy. 呼び出し元の信頼性が低いと、処理は失敗します。If the caller is semi-trusted, the addition will fail.

オブジェクトは正常に追加されますが、正常に実行されるかどうかは保証されません。Though an object is added successfully, it does not guarantee that the execution will be successful. Transform メソッドを呼び出すと、Load の実行時に指定された証拠に基づいてアクセス許可が計算され、そのアクセス許可セットが変換処理全体に割り当てられます。When the Transform method is called, permissions are calculated against the evidence provided at Load time, and that permission set is assigned to the entire transformation process. 拡張オブジェクトが、アクセス許可セットにないアクセス許可を必要とする処理を実行しようとすると、例外がスローされます。If an extension object attempts to initiate an action that requires permissions not found in the set, an exception is thrown.

拡張オブジェクトが返すデータ型は、4 つの基本 XPath 型である数値、文字列、ブール、ノード セットのうちのいずれかになります。The data types returned from extension objects are one of the four basic XPath data types of number, string, Boolean, and node set.

XSLT 拡張オブジェクトを使用するために必要な処理To use the XSLT extension object, the user needs to do the following:

  1. XsltArgumentList を作成し、AddExtensionObject を使用して拡張オブジェクトを追加します。Create an XsltArgumentList and add the extension object using AddExtensionObject.

  2. スタイル シートから拡張オブジェクトを呼び出します。Invoke the extension object from the style sheet.

  3. XsltArgumentListTransform メソッドに渡します。Pass the XsltArgumentList to the Transform method.

Example

半径が指定された円の円周を算出する例を次に示します。The following example calculates 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 = "circle.xsl"  
  
   Public Shared Sub Main()  
        Dim test As Sample = New Sample  
   End Sub  
  
  Public Sub New()  
    '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 XsltArgumentList.  
    Dim xslArg As XsltArgumentList = New XsltArgumentList  
  
    'Add an object to calculate the circumference of the circle.  
    Dim obj As Calculate = New Calculate  
    xslArg.AddExtensionObject("urn:myObj", obj)  
  
    'Create an XmlTextWriter to output to the console.  
    Dim writer As XmlTextWriter = New XmlTextWriter(Console.Out)  
  
    'Transform the file.  
    xslt.Transform(doc, xslArg, writer, Nothing)  
    writer.Close()  
  
  End Sub  
  
  'Calculates the circumference of a circle given the radius.  
  Public Class Calculate  
  
    Private circ As double = 0  
  
    Public Function Circumference(radius As Double) As Double  
       circ = Math.PI*2*radius  
       Return circ  
    End Function  
  End Class  
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 = "circle.xsl";  
  
   public static void Main() {  
  
        Sample test = new Sample();  
    }  
  
  public Sample() {  
  
    //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 XsltArgumentList.  
    XsltArgumentList xslArg = new XsltArgumentList();  
  
    //Add an object to calculate the circumference of the circle.  
    Calculate obj = new Calculate();  
    xslArg.AddExtensionObject("urn:myObj", obj);  
  
    //Create an XmlTextWriter to output to the console.  
    XmlTextWriter writer = new XmlTextWriter(Console.Out);  
  
    //Transform the file.  
    xslt.Transform(doc, xslArg, writer, null);  
    writer.Close();  
  
  }  
  
  //Calculates the circumference of a circle given the radius.  
  public class Calculate {  
  
    private double circ = 0;  
  
    public double Circumference(double radius){  
       circ = Math.PI*2*radius;  
       return circ;  
    }  
  }  
}  

入力Input

number.xmlnumber.xml

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

circle.xslcircle.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
    xmlns:myObj="urn:myObj">  
  
  <xsl:template match="data">  
  <circles>  
  <xsl:for-each select="circle">  
    <circle>  
    <xsl:copy-of select="node()"/>  
       <circumference>  
          <xsl:value-of select="myObj:Circumference(radius)"/>
       </circumference>  
    </circle>  
  </xsl:for-each>  
  </circles>  
  </xsl:template>  
</xsl:stylesheet>  

OutputOutput

<circles xmlns:myObj="urn:myObj">

<circle>

<radius>12</radius>

<circumference>75.398223686155</circumference>

</circle>

<circle>

<radius>37.5</radius>

<circumference>235.61944901923448</circumference>

</circle>

</circles>

関連項目See also