在XSLT中有任何生成计数器值的方法吗?

时间:2010-02-18 20:06:15

标签: xslt

当它们尚不存在时,有没有办法使用XSLT生成唯一ID(顺序很好)?我有以下内容:

<xsl:template match="Foo">
   <xsl:variable name="varName">
      <xsl:call-template name="getVarName">
         <xsl:with-param name="name" select="@name"/>
      </xsl:call-template>
   </xsl:variable>
   <xsl:value-of select="$varName"/> = <xsl:value-of select="@value"/>
</xsl:template>

<xsl:template name="getVarName">
   <xsl:param name="name" select="''"/>
   <xsl:choose>
      <xsl:when test="string-length($name) > 0">
         <xsl:value-of select="$name"/>
      </xsl:when>
      <xsl:otherwise>
         <xsl:text>someUniqueID</xsl:text> <!-- Stuck here -->
      </xsl:otherwise>
   </xsl:choose>
</xsl:template>

输入如下内容:

<Foo name="item1" value="100"/>
<Foo name="item2" value="200"/>
<Foo value="300"/>

我希望能够分配一个唯一的值,以便最终得到:

item1 = 100
item2 = 200
unnamed1 = 300

4 个答案:

答案 0 :(得分:2)

首先,当您调用模板时,上下文节点不会更改,您不需要在您的情况下传递参数。

<xsl:template match="Foo">
   <xsl:variable name="varName">
      <xsl:call-template name="getVarName" />
   </xsl:variable>
   <xsl:value-of select="$varName"/> = <xsl:value-of select="@value"/>
</xsl:template>

<xsl:template name="getVarName">
   <xsl:choose>
      <xsl:when test="@name != ''">
         <xsl:value-of select="@name"/>
      </xsl:when>
      <xsl:otherwise>
         <!-- position() is sequential and  unique to the batch -->
         <xsl:value-of select="concat('unnamed', position())" />
      </xsl:otherwise>
   </xsl:choose>
</xsl:template>

也许这就是你现在所需要的一切。但是,未命名节点的输出不会严格按顺序编号(unnamed1,unnamed2等)。你会得到这个:

item1 = 100
item2 = 200
unnamed3 = 300

答案 1 :(得分:1)

也许将自己的常量前缀附加到generate-id函数的结果会有效吗?

答案 2 :(得分:0)

http://www.dpawson.co.uk/xsl/sect2/N4598.html的案例5可能会帮助你。

答案 3 :(得分:0)

尝试使用类似这样的内容而不是模板:

<xsl:template match="/DocumentRootElement">
<xsl:for-each select="Foo">
  <xsl:variable name="varName">
    <xsl:choose>
      <xsl:when test="string-length(@name) > 0">
        <xsl:value-of select="@name"/>
      </xsl:when>
      <xsl:otherwise>unnamed<xsl:value-of select="position()"/></xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:value-of select="$varName"/> = <xsl:value-of select="@value"/>\r\n
</xsl:for-each>