我正在使用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中实现这一目标?
自然/惯用/故障安全解决方案将是:
<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>你,确保按照你想要的方式编号.