6

後で変換で使用する動的な名前を持つ変数を動的に作成したいのですが、これを行うには、XSL を動的に生成してから、同じスクリプトで実行する必要があります。

これは、私が探しているものの大まかな擬似コードの例です。

      <xsl:for-each select="//constants/constant" >
        <xsl:variable >
            <xsl:attribute name="name">
              <xsl:value-of select="@name"/>
            </xsl:attribute>
          <xsl:attribute name="select">
            <xsl:value-of select="@value"/>
          </xsl:attribute>
        </xsl:variable>
      </xsl:for-each>

XSL を使用して XSL を動的に構築し、後で同じスクリプトで実行することはできますか?

注: XML は、CL XSL 変換エンジンを実行するバッチ プロセスによって変換されます。したがって、XSL ドキュメントで XSL スタイルシートを参照することはできません。

4

2 に答える 2

15

XSLT には、XSLT自体である出力の生成をサポートする特別な組み込み機能があります。

これは<xsl:namespace-alias>XSLT ディレクティブです。

XSLT 1.0 Spec で説明されているように:

"

<!-- カテゴリ: トップレベル要素 -->
<xsl:namespace-alias
  stylesheet-prefix = プレフィックス | "#デフォルト"
  結果プレフィックス = プレフィックス | "#default" />

スタイルシートはこの要素を使用して、ある名前空間 URI が別の名前空間 URI のエイリアスxsl:namespace-aliasであることを宣言できます。リテラル名前空間 URI が別の名前空間 URI のエイリアスとして宣言されている場合、結果ツリーの名前空間 URI は、リテラル名前空間 URI 自体ではなく、リテラル名前空間 URI がエイリアスである名前空間 URI になります。この要素は、属性で指定されたプレフィックスにバインドされた名前空間 URI が、属性で指定されたプレフィックスにバインドされた名前空間 URI のエイリアスであることを宣言します。したがって、属性はスタイルシートに表示される名前空間 URI を指定し、属性は結果ツリーに表示される対応する名前空間 URI を指定します。"xsl:namespace-aliasstylesheet-prefixresult-prefixstylesheet-prefixresult-prefix

xsl:stylesheetxsl:variable必要な方法で構築された含むを生成する変換の小さな例を次に示します。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xxx="my:dummyNS" exclude-result-prefixes="xxx"
 >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:namespace-alias result-prefix="xsl" stylesheet-prefix="xxx"/>

 <xsl:template match="/*">
  <xxx:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xxx:変数名="{@name}">
    <xsl:value-of select="."/>
  </xxx:変数>
 </xxx:スタイルシート>
 </xsl:テンプレート>
</xsl:スタイルシート>

この変換が次の XML ドキュメントに適用される場合:

    <v name="myVarName">myValue</v>

必要な結果が生成されます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="myVarName">myValue</xsl:variable>
</xsl:スタイルシート>

次に、この動的に生成された XSLT 変換を「スクリプト」で起動します

于 2008-12-11T00:56:17.313 に答える
1

現在のところ、純粋な XSLT (1.0 または 2.0) では、あなたが望むことはできません。

Saxon 9.x XSLT プロセッサを使用している場合、これを実装する拡張関数がいくつかあります: saxon:compile-stylesheet()およびsaxon:transform()

問題の解決にそのような機能が実際に必要になることは非常にまれであり、問​​題を説明すれば、XSLT スタイルシートを動的に作成および実行しなくても問題を解決する最善の方法を見つけることができる可能性は十分にあります。

于 2008-12-11T14:22:25.843 に答える