gpt4 book ai didi

xslt - 编辑现有变量xpath的值

转载 作者:行者123 更新时间:2023-12-03 17:36:03 24 4
gpt4 key购买 nike

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

<xsl:variable name="numberVariable" select="5">
----loop----
$numberVariable = $numberVariable+2
----End loop----

最佳答案

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


答案是否定的:

XSLT是一种功能语言,除其他外,这意味着变量的值一经定义便是不可变的。

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

I.这是一个简单的示例。以下转换计算从源XML文档的document(顶部)元素的字符串值获得的整数的阶乘:

<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

但是请注意,我们根本不修改任何参数-在每次调用时,都会创建一个新的参数实例,它们具有相同的名称,但仅位于内部作用域(调用)中。



二。通常,我们可以避免进行递归:以下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>

关于xslt - 编辑现有变量xpath的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29958587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com