1

XSL を使用して、名前が別の変数 (またはパラメーター) に格納されている変数 (またはパラメーター) にアクセスすることは可能ですか? いいえの場合、なぜですか?

私は、bash、ant など、この機能にアクセスできる他の言語から来て、xsl を初めて使用します。たぶん、この質問に対する答えを探していても、私は間違っていました。しかし、SOで見つけられなかったので、あるはずだと思います。

2 つの例。パラメータがありますp1, p2, p3. 次にpname、値が string であるパラメーターがありますp2。またはのようなものをp2使用することの値を読みたいと思います。または、より複雑な方法で。が に等しい場合、 name のパラメータの値を読み取りたいと思います。pname$$pname${$pname}pnumber2concat('p', $pnumber)
param-value(concat('p', $pnumber))

4

3 に答える 3

1

これは、XSLT スタイルシートが通常の XML ドキュメントとして自身にアクセスする場合に可能です。

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

 <xsl:param name="p1" select="'P1-Value'"/>
 <xsl:param name="p2" select="'P2-Value'"/>
 <xsl:param name="p3" select="'P3-Value'"/>

 <xsl:param name="pName" select="'p3'"/>
 <xsl:param name="pNumber" select="2"/>

 <xsl:variable name="vDoc" select="document('')"/>

 <xsl:template match="/">
     <xsl:value-of select=
     "concat('Param with name ',
             $pName,
             ' has value: ',
             $vDoc/*/xsl:param[@name = $pName]/@select
             )"/>
   <xsl:text>&#xA;</xsl:text>   

   <xsl:variable name="vParam" select=
      "$vDoc/*/xsl:param[@name = concat('p', $pNumber)]"/>

     <xsl:value-of select=
     "concat('Param with name p',
             $pNumber,
             ' has value: ',
             $vParam/@select
             )"/>

 </xsl:template>
</xsl:stylesheet>

必要な結果を生成します:

Param with name p3 has value: 'P3-Value'
Param with name p2 has value: 'P2-Value'

説明:

この式document('')は、現在の XSLT スタイルシートのドキュメント ノードを選択します。

制限は、現在の XSLT スタイルシートが URI を持っている (経由でアクセスできる) 必要があることです (特定のファイルに存在し、そのファイル名でアクセスできるなど)。スタイルシートが動的に生成される場合、上記のコードは正しい結果を生成しません (メモリ内の文字列)。

于 2012-11-03T13:49:06.237 に答える
0

移植可能な回避策。アプリケーションとスタイルシートの両方を制御する場合は、パラメーターを xml ドキュメントとして渡す必要があります。ほとんどのプロセッサーには、パラメーターをノードセットにするオプションがあります。たとえば、MSXMLでは次を使用して実行しました:

xslProc.addParameter("params", xmlParams)

wherexslProcはプロセッサ タイプであり、メソッドを"Msxml2.XSLTemplate.6.0"使用して作成され、 isです。スタイルシート内で、次のようなものを使用してパラメーターにアクセスしていました。createProcessorxmlParamsDomDocument

<xsl:variable name="value">
  <xsl:value-of select="$params//*[name() = concat('p', $pnumber)]" />
</xsl:variable>

プロセッサがノード セットの外部パラメータをサポートしていない場合は、常にパラメータを 1 つの xml ドキュメント内のデータと組み合わせることができます。これはメモリ内でうまく機能します。外部ファイルへのアクセスが可能な場合は、document('params.xml')構文を使用して、別のファイルに保存されているパラメーターにアクセスできます。

また、xml 文字列を解析してそのノード セットを取得する可能性も探していましたが、一部の xslt 2.0 パーサーでは拡張機能としてのみ利用できるようです。1.0 のソリューションが必要でした。

于 2012-11-12T16:18:20.373 に答える
0

での延長libxsltも可能です。ここに説明があります。この機能をサポートすると言われているプロセッサは全部で 3 つあります。dyn:evaluate

  • Apache の Xalan-J (バージョン 2.4.1) および
  • 4Suite の 4XSLT。(バージョン 0.12.0a3)
  • Daniel Veillardらのlibxslt。(バージョン 1.0.19)
于 2012-11-12T16:23:45.567 に答える