我正在使用 XSLT 将非常大的 XML 文档转换为 (X)HTML。对于某些标签,我将它们转换为 <div>
.我希望能够为这些标签创建一个唯一的 ID,使用递增的整数构成唯一 ID 的一部分。
我正在使用的规则示例是:
<xsl:template match="bookcoll/book">
<div class="book">
<xsl:apply-templates/>
</div>
</xsl:template>
此 XSLT 模板运行良好。我现在想要的是标签:
<div class="book">;
成为:
<div class="book" id="book-[COUNTER-VALUE]">
理想情况下,计数器将从 1 开始,而不是 0。
我不知道这是否有很大区别,我正在使用 Java 包 javax.xml.parsers 和 javax.xml.transform 来执行实际的转换。我是一个 XSLT 菜鸟,所以如果我遗漏了任何相关信息,请告诉我。
这如何在 XSLT 中实现?
最佳答案
自然/惯用/故障安全解决方案是:
<div class="book" id="book-{generate-id()}">
它不是递增的,但保证是唯一的。它将生成 HTML 有效 ID 字符串 ( name tokens )。
编辑:如果它必须递增,请执行以下操作:
<!-- 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>
您可以使用 format-number()
调整 position()
的输出满足您的需求。
position()
将返回相对于当前正在处理的“批处理”的节点位置。显式调用 <xsl:apply-templates>
您确保它们按照您想要的方式编号。
关于java - 如何使用递增计数器在 XSLT 中提供唯一 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1710179/