它们是如何存储在转换中的?
除了使用“$variable”之外,我如何访问它们。我可以通过他们的名字访问他们吗?
<xsl:value-of select = '*/*/xsl:param[@name=myvariable']/@select"/>
不,参数不能通过名称动态访问,但是如果您使用支持node-set() 函数的 XSLT 处理器,您可以设置这样的映射来按名称对它们进行排序:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:param name="myParam1" />
<xsl:param name="myParam2" />
<xsl:variable name="paramsFragment">
<item name="myParam1">
<xsl:copy-of select="$myParam1"/>
</item>
<item name="myParam2">
<xsl:copy-of select="$myParam2"/>
</item>
</xsl:variable>
<xsl:variable name="params" select="msxsl:node-set($paramsFragment)/*" />
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:value-of select="$params[@name = 'myParam2']"/>
<xsl:variable name="paramName" select="'myParam1'" />
<xsl:value-of select="$params[@name = $paramName]"/>
</xsl:template>
</xsl:stylesheet>
参数的值是动态生成的,只能通过参数引用(使用'$'paramName
语法)访问。
来自 OP 的评论:
有没有办法在 xslt 文件中查看哪些参数被传递到转换中?
是的,有这样一种方式可以在很大程度上取得成功:
<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="pmyParam1" select="-999999999999999"/>
<xsl:template match="/">
<xsl:if test="not($pmyParam1 = '-999999999999999')">
$pmyParam1 has a non-default value -- was definitely set from outside !
</xsl:if>
</xsl:template>
</xsl:stylesheet>
上面的转换将参数值与指定的默认值进行比较。如果这两个值不同,这意味着传递了一个外部值。如果不是,就不能下定论。
但是,如果默认值被仔细选择为非常独特且不太可能让转换的发起者知道的东西,那么实际值和默认值相同的事实强烈暗示外部调用者没有为此参数指定了一个值。