XSLT:覆盖 fn:generate-id 函数以使用 Saxon 创建可预测的结果
XSLT: Override fn:generate-id function to create a predictable result using Saxon
我们依赖于我们无法控制的外部 XSLT 库。此库中有一些 fn:generate-id
调用,导致每次我们 运行 时结果都不同。
我们正在使用 Saxon 10.5 (Java)。有没有一种方法可以覆盖或配置 fn:generate-id
调用,使其产生可预测的结果,同时保持节点的唯一性?
您可以 post 处理输出以将 ID 替换为您自己生成的 ID,或者您可以更改样式表逻辑以改为使用 xsl:number(或累加器函数)。
在极端情况下,您可以定义您自己的 Saxon NodeInfo 接口实现(可能是现有实现的子类),在这种情况下您可以完全控制 generateId 算法,但这会进入相当深的水域。
事实上,至少对于 TinyTree 模型,Saxon 生成的 ID 分为两部分:文档编号和文档中的节点编号。如果文件没有改变,那么第二部分不应该改变。您可以 post 处理结果以去除文档编号。但是当然你已经在你的应用程序中引入了一个依赖项,你假设 Saxon 不会改变它的策略。
我们依赖于我们无法控制的外部 XSLT 库。此库中有一些 fn:generate-id
调用,导致每次我们 运行 时结果都不同。
我们正在使用 Saxon 10.5 (Java)。有没有一种方法可以覆盖或配置 fn:generate-id
调用,使其产生可预测的结果,同时保持节点的唯一性?
您可以 post 处理输出以将 ID 替换为您自己生成的 ID,或者您可以更改样式表逻辑以改为使用 xsl:number(或累加器函数)。
在极端情况下,您可以定义您自己的 Saxon NodeInfo 接口实现(可能是现有实现的子类),在这种情况下您可以完全控制 generateId 算法,但这会进入相当深的水域。
事实上,至少对于 TinyTree 模型,Saxon 生成的 ID 分为两部分:文档编号和文档中的节点编号。如果文件没有改变,那么第二部分不应该改变。您可以 post 处理结果以去除文档编号。但是当然你已经在你的应用程序中引入了一个依赖项,你假设 Saxon 不会改变它的策略。