<msxsl:script> 要素
XSLT 変換でカスタム関数を使用できるように、スクリプト ブロックを格納しています。 これは最上位の要素です。
<msxsl:script
language = "language-name"
implements-prefix = "prefix of user's namespace">
</msxsl:script>
属性
language
この要素内で定義されている関数のために使用するアクティブ スクリプティング言語。 指定されていない場合は、Microsoft® JScript® (ECMA 262 言語仕様と互換性がある) が使用されます。 この属性は、HTML の <SCRIPT> 要素の language 属性と同じ値を受け付けます。マネージ コードの場合、この属性は、CreateProvider によって受け入れられている言語の名前を受け付けます。
implements-prefix
必ず指定します。 プレフィックスをスクリプト ブロックと関連付けます。 この属性の値は、名前空間を表すプレフィックスです。
要素情報
出現回数 |
無制限 |
親要素 |
|
子要素 |
<msxsl:assembly> Element <msxsl:using> Element |
解説
<msxsl:script> 要素は urn:schemas-microsoft-com:xslt 名前空間に属しています。 この要素内では、変数を宣言し、関数を定義することができます。 この要素は、<xsl:stylesheet> 要素内に指定することができます。 このように入れ子になったスクリプトは、グローバルなスクリプト ブロックとして扱われます。
<msxsl:assembly> 子要素と <msxsl:using> 子要素は、.NET Framework 内のマネージ コードにだけ使用できます。 使用時には、これらの要素はすべてのスクリプト コードより前に、またスクリプト ブロックの先頭に記述する必要があります。
アンマネージ コードでは、<msxsl:script> 要素内で COM オブジェクトをインスタンス化することもできます。 ただし、ユーザーのセキュリティ設定によって、スクリプトによるクライアント側オブジェクトのインスタンス化が防止される場合があります。
パフォーマンスを重視する場合は、XSLT ファイルからスクリプト ブロックを呼び出さないようにします。これは、スクリプト エンジンを複数回読み込む必要があるためです。 その代わりに、スクリプトと同等の COM オブジェクトを作成して DLL を生成します。 次に、addObject を使用してこの DLL を渡します。
使用例
この例では、xml() という関数を宣言する際に、<msxsl:script> を使用して user という名前空間プレフィックスを持つスクリプト ブロックを定義する方法を示します。 xml() 関数の引数には、ノード一覧が使用されます。 user 名前空間内の xml(nodelist) に着目し、この関数が <xsl:value-of> の select 属性からどのように呼び出されるかを確認してください。
XML ファイル (customers.xml)
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="script.xsl" ?>
<customers>
<customer>
<name>John Smith</name>
<address>123 Elm St.</address>
<phone>(123) 456-7890</phone>
</customer>
<customer>
<name>Mary Jones</name>
<address>456 Oak Ave.</address>
<phone>(156) 789-0123</phone>
</customer>
</customers>
XSLT ファイル (script.xsl)
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://mycompany.com/mynamespace">
<msxsl:script language="JScript" implements-prefix="user">
function xml(nodelist) {
return nodelist.nextNode().xml;
}
</msxsl:script>
<xsl:template match="/">
<xsl:value-of select="user:xml(.)"/>
</xsl:template>
</xsl:stylesheet>
出力
これは書式付き出力です。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="script.xsl" ?>
<customers>
<customer>
<name>John Smith</name>
<address>123 Elm St.</address>
<phone>(123) 456-7890</phone>
</customer>
<customer>
<name>Mary Jones</name>
<address>456 Oak Ave.</address>
<phone>(156) 789-0123</phone>
</customer>
</customers>
これはプロセッサ出力です。
<?xml version="1.0"?><?xml version="1.0"?><?xml-stylesheet
type="text/xsl" href="script.xsl" ?><customers>
<customer> <name>John Smith</name>
<address>123 Elm St.</address> <phone>(123) 456-
7890</phone> </customer> <customer> <name>Mary
Jones</name> <address>456 Oak Ave.</address>
<phone>(156) 789-0123</phone>
</customer></customers>