当 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(例如驻留在给定文件中并通过其文件名可访问)——如果样式表是动态生成的,上述代码不会产生正确的结果(内存中的字符串)。