如何保留一个变量值并在XSLT中更新它

问题描述:

我有一个称为ID的属性,每当该值被分配给它时,它就会加1。我有一种情况,每次输入循环时都会增加值。外部循环有2条记录,内部循环有3条记录。如何保留一个变量值并在XSLT中更新它

外环1 - 内环1,2,和3中,ID属性被递增为1,2和3,但

外环2 - 内环....再次ID属性开头1.我需要这是4,5等......

此增量ID没有与输入XML文件相关的数据。所有的处理都必须在XSLT中完成。

XSLT文件:

<xsl:variable name="localISYMPid" select="0"/> 
<xsl:element name="Test1"> 

    <xsl:for-each select="Solutions/Solution"> 

     <xsl:if test="Observations/Observation!= '' "> 

      <xsl:for-each select="Observations/Observation"> 
       <xsl:element name="Roles"> 

        <!-- Generating the ID value --> 
        <xsl:variable name="ids" select="generate-id(.)"/> 
        <!-- ***************************--> 

        <xsl:attribute name="CK"><xsl:value-of select="substring-after($ids,'Solution')"/></xsl:attribute> 
        <xsl:attribute name="ID"><xsl:value-of select="position() + $localISYMPid "/></xsl:attribute> 
       </xsl:element> 
      </xsl:for-each> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:element> 

请帮帮我在打印时内环环绕对于外环1的3倍和外环2和当内环为1 ID 4的值, ID值应为4个。截至目前,它的再次印刷1 ..

ID  1 
ID  2 
ID  3 
---------- 
ID  1(it should print 4) 

我使用XSLT 1.0

谢谢 拉姆

您正在使用position()函数来确定其父元素(本例中为Observation)的本地ID。如果你真的想要一个全球的节点,那么你可以做一些像count(preceding::Roles) + 1这样的事情,它会在当前节点之前统计所有Roles节点,然后添加一个节点。

您可能需要限制preceding::Roles谓词远一点根据您的要求,如preceding::Roles[parent::Observation]例如,要确保你只计算Roles元素是一个Observation元素的子元素。

显示源文件总是有用的。但我怀疑你可以用类似

<xsl:attribute name="ID"> 
    <xsl:number level="any" from="Solution"/> 
</xsl:attribute> 
+0

+1这个特定任务的XSLT intruction得到你想要的结果。 – 2011-04-14 16:30:25