1

是否可以使用 XSL 访问名称存储在另一个变量(或参数)中的变量(或参数)?如果不是,为什么?

我是 xsl 的新手,来自其他可以访问此功能的语言,例如 bash、ant。也许我在寻找这个问题的答案时是错的。但由于我没有在 SO 上找到它,我认为应该有一个。

两个例子。我有参数p1, p2, p3. 然后我有一个参数pname,其值为 string p2。我想阅读p2using的价值pname,比如$$pnameor ${$pname}。或者以更复杂的方式。如果pnumber等于2,那么我想用名称读取参数的值concat('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

libxslt事物中通过dyn:evaluate扩展是可能的。这是描述。总共提到了 3 个处理器,据说它们支持此功能:

  • 来自 Apache 的 Xalan-J(版本 2.4.1)和
  • 4XSLT,来自 4Suite。(版本 0.12.0a3)
  • 来自 Daniel Veillard 等人的 libxslt。(版本 1.0.19)
于 2012-11-12T16:23:45.567 回答
0

便携式解决方法。如果您同时控制应用程序和样式表,则应将参数作为 xml 文档传递。大多数处理器都提供了使参数成为节点集的选项。例如,在 MSXML 中,我使用:

xslProc.addParameter("params", xmlParams)

其中xslProcis 属于处理器类型,由"Msxml2.XSLTemplate.6.0"使用createProcessor方法创建,并且xmlParamsis 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 解决方案。

于 2012-11-12T16:18:20.373 回答