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

标签 java xslt xhtml

我正在使用 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/

相关文章:

java - Azure 构建管道,docker compose - 设置环境变量

java - Android Studio 应用程序可在模拟器中运行,但不能在真实设备上运行

java - 如何用java定位并执行文件

java - Java 继承中私有(private)访问说明符的使用

xml - 在 XSLT 中使用 for 循环

xml - XSLT - 如何按属性选择 XML 属性?

javascript - XHTML Mobile 1.0 - W3C 验证因脚本而无效

javascript - iScroll 滚动越过底部?

xslt - XSL : Problem with cicling

html - CSS 定位框使用 ul li div