是否可以使用XSL访问名称存储在另一个变量(或参数)中的变量(或参数)?如果不是,为什么?
我是xsl的新手,来自其他语言,可以访问此功能,例如bash,ant。也许我甚至错误地寻找这个问题的答案。但由于我没有在SO上找到它,我认为应该有一个。
两个例子。我有参数p1
,p2
,p3
。然后我有一个参数pname
,其值为字符串p2
。我想使用p2
来阅读pname
的值,例如$$pname
或${$pname}
。或者以更复杂的方式。如果pnumber
等于2
,那么我想读取名称为concat('p', $pnumber)
的参数值,我将其编码为param-value(concat('p', $pnumber))
。< / p>
答案 0 :(得分:0)
当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(例如驻留在给定文件并可通过其文件名访问) - 如果样式表是以上代码,则上述代码不会产生正确的结果动态生成(内存中的字符串)。
答案 1 :(得分:0)
便携式解决方法。如果您同时控制应用程序和样式表,则应将参数作为xml文档传递。大多数处理器都提供了使参数成为节点集的选项。例如在MSXML中我使用:
xslProc.addParameter("params", xmlParams)
其中xslProc
属于处理器类型,使用"Msxml2.XSLTemplate.6.0"
方法从createProcessor
创建,xmlParams
为DomDocument
。在样式表中,我使用类似的东西访问我的参数:
<xsl:variable name="value">
<xsl:value-of select="$params//*[name() = concat('p', $pnumber)]" />
</xsl:variable>
如果处理器不支持节点设置外部参数,则可以始终将参数与一个xml文档中的数据组合在一起。这在记忆中很有效。如果可以访问外部文件,可以使用document('params.xml')
语法访问存储在单独文件中的参数。
我也在寻找解析xml字符串的可能性并拥有它的节点集,但它似乎只能作为某些xslt 2.0解析器的扩展。我想要1.0解决方案。
答案 2 :(得分:0)
在libxslt
中,通过 dyn:evaluate
扩展程序可以实现这一目标。这是the description。据说共有3个处理器可以支持这个功能: