如何使用递增的计数器在XSLT中提供唯一的ID?

Gru*_*eck 3 java xslt xhtml

我正在使用XSLT将非常大的XML文档转换为(X)HTML.对于某些标签,我将它们转换为a <div>.我希望能够为这些标记创建唯一的id,使用递增的整数形成唯一id的一部分.

我使用的规则的一个例子是:

<xsl:template match="bookcoll/book">
    <div class="book">
        <xsl:apply-templates/>
    </div>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

这个XSLT模板运行良好.我现在想要的是标签:

<div class="book">;  
Run Code Online (Sandbox Code Playgroud)

变得:

<div class="book" id="book-[COUNTER-VALUE]">  
Run Code Online (Sandbox Code Playgroud)

理想情况下,计数器将从1开始,而不是0.

我不知道它是否有很大的不同,我使用Java包javax.xml.parsers和javax.xml.transform来执行实际的转换.我是一个XSLT菜鸟,所以如果有任何我错过的相关信息,请告诉我.

如何在XSLT中实现这一目标?

Tom*_*lak 7

自然/惯用/故障安全解决方案将是:

<div class="book" id="book-{generate-id()}">
Run Code Online (Sandbox Code Playgroud)

它没有递增,但它保证是独一无二的.它将生成HTML有效的ID字符串(名称标记).

编辑:如果必须递增,请执行以下操作:

<!-- in the calling template… -->
<xsl:apply-templates select="bookcoll/book[xpath to filter them if necessary]" />

<!-- …later -->
<xsl:template match="bookcoll/book">
  <div class="book" id="book-{position()}">
    <xsl:apply-templates/>
  </div>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

您可以根据format-number()需要调整输出position().

position()将返回相对于当前正在处理的"批处理"的节点位置.明确打电话给<xsl:apply-templates>你,确保按照你想要的方式编号.