如何在xslt中累积position()函数的值

时间:2011-08-11 06:44:09

标签: xslt netcdf ncml

我有这个xml文件

<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2" location="file:/dev/null" iosp="lasp.tss.iosp.ValueGeneratorIOSP" start="0" increment="1">
    <attribute name="title" value="Vector time series"/>
    <dimension name="time" length="100"/>
    <variable name="time" shape="time" type="double">
        <attribute name="units" type="String" value="seconds since 1970-01-01T00:00"/>
    </variable>
    <group name="Vector" tsdsType="Structure" shape="time">
        <variable name="x" shape="time" type="double"/>
        <variable name="y" shape="time" type="double"/>
        <variable name="z" shape="time" type="double"/>
    </group>
</netcdf>

我需要xslt文件,它提供像这样的输出

1.time
2.Vector

这是两个标签的名称属性:变量和组。目前我有这样的代码

 <xsl:for-each select="document($path)//*[local-name()='variable']">
        <xsl:if test="string-length( @*[local-name()='name'] ) >1">
        <li>
         <xsl:value-of select="position()"/>
        <xsl:value-of select="@*[local-name()='name']"/>
        </li>
        </xsl:if>
      </xsl:for-each>
         <xsl:for-each select="document($path)//*[local-name()='group']">
        <li>
        <xsl:value-of select="position()"/>
        <xsl:value-of select="@*[local-name()='name']"/>
        </li>
      </xsl:for-each>

它会给我

1.time
1.Vector

那么我如何通过这个position()函数达到我的目标,或者在XSLT中还有其他更好的方法吗?非常感谢提前。

1 个答案:

答案 0 :(得分:1)

您可以使用position()但它应该在同一个重复指令中使用。使用前缀say x声明名称空间并使用:

<xsl:for-each select="document($path)//x:netcdf/*
      [self::x:variable or self::x:group]"/>

此外,我会使用xsl:number之类的:

<xsl:number value="position()" format="1."/>

还要考虑在样式表中声明默认命名空间,以便摆脱local-name()测试。