2

我有这个 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 中还有其他更好的方法吗?提前非常感谢。

4

1 回答 1

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()测试。

于 2011-08-11T07:24:01.903 回答