【问题标题】:Generating UUID`s with Xalan instead of Saxon in XSLT 2.0在 XSLT 2.0 中使用 Xalan 而不是 Saxon 生成 UUID
【发布时间】:2017-08-02 08:01:35
【问题描述】:

我尝试在 XSLT 中使用 Xalan 而不是 Saxon 来生成随机 UUID

这是代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions"  
xmlns:uuid="xalan://java.util.UUID">
  <xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="uid" select="uuid:randomUUID()"/>
<xsl:value-of select="$uid"/>
</xsl:template>
</xsl:stylesheet>

我使用 Xalan 而不是 Saxon 的原因是:它是免费的。 所以我需要购买 Saxon 以将其用于我的目的。

这个想法是当我尝试转换一个 XML 文件时,我想生成这个 UUID 并将其放入我想要的节点。

我正在使用的参考:

http://www.pure-xml.com/cblog/index.php?/archives/8-Generating-UUIDs-with-XSL-and-Java.html

执行的错误是:

 XSL transformation failed
XTDE1420: Error in XPath 2.0 expression
Unknown function - Name and number of arguments do not match any function 
signature in the static context - 'xalan://java.util.UUID:randomUUID'

【问题讨论】:

  • Xalan 根本不支持 XSLT 2.0,所以我不确定您的帖子为什么提到将 Xalan 与 XSLT 2.0 一起使用。并且错误消息看起来好像来自撒克逊人,所以不知何故,如果您打算使用 Xalan,那么我认为您还没有这样做。
  • 那么在 XSLT 2.0 中替代 Xalan 和 Saxon 的解决方案可能是什么?
  • 好吧,要使用该 Java 类来创建 UUID,我认为您不需要特定版本的 XSLT,您需要编写一个 Java 程序来调用该类,然后传入生成的值作为 XSLT 样式表的参数,无论您使用 XSLT 1.0 还是 2.0 处理器执行此操作似乎都无关紧要。如果您真的想直接从您的 XSLT 编写 Java 代码,那么您将不得不探索您的 XSLT 处理器对此的支持,对于 Saxon 9 HE,请参阅saxonica.com/html/documentation/extensibility/…,但它也需要编写 Java 代码。
  • 是的,我已经用 Saxon HE 尝试过,但它不起作用,Java 说你需要 Saxon PE 或更高版本才能在 XSLT 中使用它(这不是免费的)。我正在寻找一个免费的首先是解决方案。
  • 使用参数或集成扩展函数是“免费的”,您只需要用Java编写代码。

标签: xml xslt


【解决方案1】:

使用 XalanJava 中生成 UUID:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:java="http://xml.apache.org/xalan/java"
exclude-result-prefixes="java">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <uuid>
        <xsl:value-of select="java:java.util.UUID.randomUUID()"/>
    </uuid>
</xsl:template>

</xsl:stylesheet>

演示:http://xsltransform.net/bEzjRKi


请注意,并非所有 Xalan 版本都支持使用 Java 作为扩展。

【讨论】:

  • 谢谢,但我有一个错误 XPath 表达式中的错误未知函数 - 参数名称和数量与静态上下文中的任何函数签名都不匹配 - 'xml.apache.org/xalan/java:java.util.UUID.randomUUID' 我需要使用 XSLT 2.0 不1.0
  • @Sojimanatsu 你可以看到它在这里工作:xsltransform.net/bEzjRKi(当服务没有关闭时,通常是这样)。检查您正在使用哪个版本的 Xalan。
  • 谢谢,但我在不支持的 xslt 2.0 中仍然需要它,所以我想 Xalan 现在不是我的选择。由于撒克逊人也无法正常工作,我不知道该怎么办
  • 正在通过添加 UUID 来更改它,不是吗?看来你也想吃蛋糕。
  • 像许多用户一样,OP 想要免费午餐。他想要 XSLT 2.0,但他希望其他人为此付费。一种选择可能是使用 Saxon-B 9.1,这是最后一个支持直接调用 Java 扩展函数的开源版本。
猜你喜欢
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
相关资源
最近更新 更多