在decleration </xsl:variable>之后分配给<xsl:variable>

时间:2012-03-08 06:29:55

标签: xslt xslt-2.0

我使用以下方式为变量赋值。

<xsl:variable name="NewValue">
  <xsl:value-of select="normalize-space(//root/id/amount)"/>
</xsl:variable>

在赋值后,我想为同一个变量赋值。像这样: -

<xsl:variable name="NewValue" select="normalize-space(//root/id/amountnew)">

有什么办法吗?


这里是我的XML样本:

<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>

我的问题是我需要获取特定<Vest_RecDate>的最新<Vest_DocType>(比如说​​SDD)然后我需要在xml之前搜索<Vest_RecDate>之前的任何日期(相同) SDD)。

如果然后单独提升该特定部分(<VolLien>)并再次提出最新部分。如果我可以重新分配,我会定位节点并获取与之关联的值。现在我正在使用另一个循环。如果有什么东西我可以避免extrs循环。

3 个答案:

答案 0 :(得分:8)

没有。 XSLT变量是只读的。它们不能多次分配。

XSLT不是像PHP这样的命令式编程语言。重新分配变量既不可能也不必要。


编辑:根据您的评论:

  

我的问题是我需要获取特定<Vest_DocType>的最新信息(比如说SDD),然后我需要在xml中搜索此<Vest_RecDate>之前的任何日期(相同的SDD)。

这是一个可以为您执行此操作的XSLT代码段:

<!-- 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>

答案 1 :(得分:4)

除了之前的答案之外,您还尝试使用从其他编程语言中学到的低级命令式技术来解决某些问题。为了帮助您使用适合XSLT的声明性方法解决问题,我们需要对问题进行描述。使其尽可能高 - 将输出描述为输入的函数,而不是描述您认为从一个到另一个所需的计算步骤。

答案 2 :(得分:2)

除了Tomalak的回答。

变量在一个块中被限制/本地,在该块中声明它并赋值(声明和赋值一次发生)。

假设在示例中:

  <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>