首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在应用模板模式下使用变量的值

在应用模板模式下使用变量的值
EN

Stack Overflow用户
提问于 2012-09-06 19:21:00
回答 3查看 7.4K关注 0票数 14

我想应用一个依赖于变量值的模式的模板。

代码语言:javascript
运行
复制
<xsl:variable name="mode" select="@attribute"/>
<xsl:apply-templates mode="{$mode}"/>

我得到了样式表无法编译的错误。QName的值应该是一个模式,但它是"{$mode}“。

是否有可能使用依赖于变量的模式?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-06 19:57:23

使用基于表达式的特定模式的唯一选择是使用

代码语言:javascript
运行
复制
<xsl:choose>
   <xsl:when test="@attribute = 'foo'">
      <xsl:apply-templates mode="bar"/>
   </xsl:when>
   <xsl:otherwise>
      <xsl:apply-templates/>
   </xsl:otherwise>
</xsl:choose>

或者xsl:if也是如此。在XSLT1.0中,mode属性值本身需要是一个QName,在XSLT2.0中,它允许使用QName或像#current#default‘这样的特殊标记。但是您不能在运行时计算mode值。

票数 9
EN

Stack Overflow用户

发布于 2012-09-06 19:34:45

模式不是属性值模板(AVT)的有效候选模式。你根本不能这样做。

XSLT 2.0 spec

定义:在指定为属性值模板的属性中,例如文字结果元素的属性,可以通过用大括号({})将表达式括起来来使用表达式。

模式在规范中没有指定为AVT,所以你不能这样做。

票数 5
EN

Stack Overflow用户

发布于 2012-09-06 20:05:49

我收到无法编译样式表的错误。QName的值应该是一个模式,但它是"{$mode}“。

是否有可能使用依赖于变量的模式?

不,这在任何XSLT版本中都不受支持-- 1.0、2.0或3.0。

由于您实际上是在尝试模拟高阶函数(HOF),因此可以在XSLT1.0中使用的基本原理来实现这一点。

FXSL1.x是一个用纯XSLT1.0编写的模板库,它支持/模拟HOF。

这里的是一个基于这些原则的完整解决方案

代码语言:javascript
运行
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:f="http://fxsl.sf.net" exclude-result-prefixes="f">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

   <f:inc/>
   <f:double/>

 <xsl:variable name="vModeInc" select="document('')/*/f:inc[1]"/>
 <xsl:variable name="vModeDouble" select="document('')/*/f:double[1]"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <nums>
    <xsl:apply-templates select="$vModeInc">
      <xsl:with-param name="pNodes" select="node()"/>
    </xsl:apply-templates>
  </nums>
==============
  <nums>
    <xsl:apply-templates select="$vModeDouble">
      <xsl:with-param name="pNodes" select="node()"/>
    </xsl:apply-templates>
  </nums>
 </xsl:template>

 <xsl:template match="f:inc">
   <xsl:param name="pNodes"/>
   <xsl:apply-templates select="$pNodes" mode="incr"/>
 </xsl:template>

 <xsl:template match="f:double">
   <xsl:param name="pNodes"/>
   <xsl:apply-templates select="$pNodes" mode="double"/>
 </xsl:template>

 <xsl:template match="num" mode="incr">
  <num><xsl:value-of select=".+1"/></num>
 </xsl:template>

 <xsl:template match="num" mode="double">
  <num><xsl:value-of select=".*2"/></num>
 </xsl:template>
</xsl:stylesheet>

在以下XML文档上应用此转换时为

代码语言:javascript
运行
复制
<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

生成所需的、正确的结果 --根据指定的变量,以两种可用模式中的一种(每种)方式处理的nums/num元素-- $vModeInc (每个值加1)或$vModeDouble (每个值乘以2):

代码语言:javascript
运行
复制
<nums>
   <num>2</num>
   <num>3</num>
   <num>4</num>
   <num>5</num>
   <num>6</num>
   <num>7</num>
   <num>8</num>
   <num>9</num>
   <num>10</num>
   <num>11</num>
</nums>
==============
  <nums>
   <num>2</num>
   <num>4</num>
   <num>6</num>
   <num>8</num>
   <num>10</num>
   <num>12</num>
   <num>14</num>
   <num>16</num>
   <num>18</num>
   <num>20</num>
</nums>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12298932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档