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

时间:2011-04-14 07:57:05

标签: xml xslt

我有一个名为ID的属性,每次将值赋值给它时都会递增1。我的情况是每次输入循环时要递增的值。外循环有2条记录,内循环有3条记录。

外循环1 - 内循环1,2和3,ID属性增加为1,2和3,但

外循环2 - 内循环....再次ID属性从1开始。我需要这个是4,5等等..

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

XSLT FIle:

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

请帮我打印ID 4的值,因为当内循环为外循环1和外循环2循环3次时,当内循环为1时,ID值应为4。现在,再打印1 ..

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

我正在使用XSLT 1.0

谢谢你, 拉姆

2 个答案:

答案 0 :(得分:2)

显示源文档总是很有用。但我怀疑你可以用

之类的东西达到你想要的效果
<xsl:attribute name="ID">
  <xsl:number level="any" from="Solution"/>
</xsl:attribute>

答案 1 :(得分:0)

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

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