问题
I am using the below way to assign value to a variable.
<xsl:variable name="NewValue">
<xsl:value-of select="normalize-space(//root/id/amount)"/>
</xsl:variable>
After the assignment I want to assign new value to the same variable. Like this:-
<xsl:variable name="NewValue" select="normalize-space(//root/id/amountnew)">
Is there any way for this?
Here the sample of XML that I have:
<VolLien>
<Vest_DocType>SDD</Vest_DocType>
<Vest_Instrument>395072</Vest_Instrument>
<Vest_OfOfficialEntity>eee</Vest_OfOfficialEntity>
<Vest_RecDate>12/24/2009</Vest_RecDate>
<Vest_Grantee1>abc dd</Vest_Grantee1>
<Vest_Grantor1>sss</Vest_Grantor1>
<Vest_RejectCode />
<Vest_RejectReason />
<Vest_ImageNum> </Vest_ImageNum>
</VolLien>
My problem is I need to get latest <Vest_RecDate>
of particular <Vest_DocType>
(say SDD) And then I need to search across the xml any date which is before <Vest_RecDate>
of this(same SDD).
If then raise that particular section(<VolLien>
) alone and again latest. If I could have reassignment I would position of the node and get the values associated to that. Now I am doing this using another loop. If something is there I can avoid extrs loops.
回答1:
No. XSLT variables are read-only. They cannot be assigned multiple times.
XSLT is not an imperative programming language like, say, PHP. Reassigning variables is both impossible and unnecessary.
EDIT: According to your comment:
My problem is I need to get latest of particular
<Vest_DocType>
(say SDD) and then I need to search across the xml any date which is before<Vest_RecDate>
of this (same SDD).
here is an XSLT snippet that can do this for you:
<!-- a key to retrieve all <VolLien> nodes of a particular DocType -->
<xsl:key name="VolLien-by-DocType" match="VolLien" use="Vest_DocType" />
<xsl:template match="/">
<xsl:call-template name="latest-VolLien">
<xsl:with-param name="DocType" select="'SDD'" />
</xsl:call-template>
</xsl:template>
<!-- this template processes specified <VolLien> nodes in the right order -->
<xsl:template name="latest-VolLien">
<xsl:param name="DocType" select="''" />
<xsl:for-each select="key('VolLien-by-DocType', $DocType)">
<!-- sorting is a little complicated because you
use dd/mm/yyyy instead of yyyymmdd -->
<xsl:sort
select="
number(substring(Vest_RecDate, 7, 4)) +
number(substring(Vest_RecDate, 4, 2)) +
number(substring(Vest_RecDate, 1, 2))
"
data-type="number"
/>
<!-- do something with last <VolLien> (in date order) -->
<xsl:if test="position() = last()">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="VolLien">
<!-- this template will actually process the nodes,
do whatever you want here -->
</xsl:template>
回答2:
Further addition to previous answers: you're trying to solve some problem using low-level imperative techniques that you have learnt from other programming languages. To help you solve the problem using the declarative approach appropriate to XSLT, we will need a description of the problem. Make it as high level as possible - describe the output as a function of the input, rather than describing the computational steps you think are needed to get from one to the other.
回答3:
Addition to Tomalak's answer.
A variable is limited/local to a block in which it is declared and assigned with value (declaration and assignment happen at once).
Suppose in example:
<xsl:template match="Node1">
<xsl:variable name="test" select="'test_value'"/>
<xsl:for-each select="foo">
<xsl:variable name="var1" select="."/>
<xsl:value-of select="$var1"/>
</xsl:for-each>
<xsl:for-each select="bar">
<xsl:value-of select="$var1"/>
<!--The variable "$var1" is out of scope.. So above statement is wrong-->
</xsl:for-each>
</xsl:template>
<xsl:template match="Node2">
<xsl:value-of select="$test"/>
<!--The variable "$test" is out of scope.. So above statement is wrong too!-->
</xsl:template>
来源:https://stackoverflow.com/questions/9613753/assign-to-xslvariable-after-thedecleration