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