как накапливать значение функции position () в xslt - PullRequest
2 голосов
/ 11 августа 2011

У меня есть этот 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

, которые являются атрибутом имени двух тегов: variable и group,В настоящее время у меня есть код, подобный этому

 <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 Ответ

1 голос
/ 11 августа 2011

Вы можете использовать position(), но его следует использовать внутри той же инструкции повторения.Объявите пространство имен с префиксом скажем 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() тестов.

...