编辑现有变量xpath的值

时间:2015-04-30 03:35:21

标签: xslt xpath

我有一个我设置值的变量。此后,在循环中,我想编辑此变量并在下一次迭代中使用它。有什么办法可以编辑变量中的值吗?谢谢!

grad

2 个答案:

答案 0 :(得分:2)

  

在循环中,我想编辑这个变量并在下一次迭代中使用它。有什么办法可以编辑变量中的值吗?

答案是否定的

XSLT是一种函数式语言,除其他外,这意味着变量的值一旦定义就是不可变的。

通过调用语言的另一个可调用单元(模板或函数)并将所需的新值作为参数传递,可以以更安全的方式实现相同的效果

<强>予。这是一个简单的例子。以下转换计算整数的阶乘,从源XML文档的document(top)元素的字符串值获得:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

  <xsl:template match="/*/text()" name="factorial">
    <xsl:param name="pN" select="."/>
    <xsl:param name="pAccum" select="1"/>

    <xsl:value-of select="substring($pAccum, 1 div not($pN > 1))"/>
    <xsl:apply-templates select="self::node()[$pN > 1]">
      <xsl:with-param name="pN" select="$pN -1"/>
      <xsl:with-param name="pAccum" select="$pAccum * $pN"/>
    </xsl:apply-templates>
  </xsl:template>
</xsl:stylesheet>

将此转换应用于以下源XML文档时:

<t>9</t>

产生了想要的正确结果

362880

在上面的代码中,我们看到参数$pN的值如何从调用到调用“减少”,直到达到1,参数$pAccum的值每次调用时乘以参数$pN的值。

请注意,但是,我们根本不修改任何参数 - 在每次调用时,都会创建一个具有相同名称的新参数实例,但是只生活在内在范围内(呼唤)。

<强> II。通常我们可以避免递归的需要:以下XSLT 1.0转换计算并输出从120的数字的多维数据集:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:variable name="vDoc" select="document('')"/>

  <xsl:template match="/*" name="cubes">
    <xsl:param name="pN" select="20"/>

    <xsl:for-each select=
    "($vDoc//node() | $vDoc//node()/@* | $vDoc//namespace::*)
                                             [not(position() > $pN)]">
      <xsl:variable name="vM" select="position()"/>

      <xsl:value-of select="$vM*$vM*$vM"/>
      <xsl:text>&#xA;</xsl:text>                                            
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

当此转换应用于任何源XML文档(未使用)时,会生成所需的正确结果

1
8
27
64
125
216
343
512
729
1000
1331
1728
2197
2744
3375
4096
4913
5832
6859
8000

请注意如何调用标准XPath函数position()来生成“循环计数器”:)。这是众所周知的method of Piez

从XSLT 2.0及更高版本开始,不需要这样的技巧。可以使用XPath 2.0 range expression

简单地编写以下内容
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:variable name="vDoc" select="document('')"/>

  <xsl:template match="/*" name="cubes">
    <xsl:param name="pN" select="20"/>

    <xsl:for-each select="1 to $pN">
      <xsl:value-of select=". * . *."/>
      <xsl:text>&#xA;</xsl:text>                                            
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

查看xsl:number元素 - 您可以执行以下操作:

<xsl:variable name="numberVariable">
  <xsl:number/>
</xsl:variable>
<xsl:value-of select="$numberVariable * 2"/>

很难确切地知道你在问题中做了什么,但希望这可以指出你正确的方向。