2014-12-26 168 views
0

我是xslt的新手。我想使用xslt生成32位长的UUID,并将它添加到作为输入的xml中。我试图使用数学自由的随机函数,但得到错误。如何使用xslt生成随机UUID

输入XML

<users xmlns="ABC_Login"> 
    <email>[email protected]</email> 
</users> 

XSLT片段

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="ABC_Login" xmlns:math="http://exslt.org/math" 
extension-element-prefixes="math" version="2.0"> 
    <xsl:template match="/ns1:users"> 
     <users> 
      <email> 
       <xsl:value-of select="ns1:email" /> 
      </email> 
      <UUID> 
       <xsl:value-of select="(floor(math:random()*10) mod 10) + 1" /> 
      </UUID> 
     </users> 
    </xsl:template> 
</xsl:stylesheet> 

我使用在线编辑器,但得到的例外如下。 http://xslttest.appspot.com/

错误:无法找到名为{http://exslt.org/math} random()的匹配0参数函数。没有撒克逊扩展功能与本地名称随机

其实我需要使用xslt生成随机令牌并将其添加到输入xml中。

预期输出

<users xmlns="ABC_Login"> 
     <email>[email protected]</email> 
     <uuid>7B81A9B0D9-CA0E-E70F-ADFF-116EE7A1A980<</uuid> 
    </users> 

任何人可以帮助我在这方面。最好的问候,

+0

并非所有XSLT 1.0处理器都实现所有EXSLT扩展功能。你将在实际生产中使用哪种处理器? –

+0

你在纯xslt-1.0中的所有内容是 'generate-id()' – newtover

+0

其实我在登录时需要输入xml的预期输出。有没有办法在xslt中做到这一点?谢谢。 – user3141034

回答

8

您收到错误的原因是您使用的XSLT 2.0处理器(Saxon 9)不支持EXSLT数学运算:random()函数。

不幸的是,在XSLT 2.0或者没有原生的随机()函数,但与撒克逊人,你可以调用Java方法 - 例如:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:math="java.lang.Math" 
exclude-result-prefixes="math"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/"> 
    <output> 
     <xsl:variable name="random" select="math:random()"/> 
     <xsl:value-of select="$random"/> 
    </output> 
</xsl:template> 

</xsl:stylesheet> 

生成一个随机数或:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:uuid="java.util.UUID" 
exclude-result-prefixes="uuid"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/"> 
    <output> 
     <xsl:variable name="random" select="uuid:randomUUID()"/> 
     <xsl:value-of select="$random"/> 
    </output> 
</xsl:template> 

</xsl:stylesheet> 

生成random UUID

+0

不幸的是,这对撒克逊人来说是不可能的。 –

+0

但是您可以自己在XSLT 2中实现UUID:请参阅上面对问题的评论中的链接。 –