我们如何在XSLT2.0中将两个或更多UUID号(十六进制数)相加

时间:2018-04-16 10:34:52

标签: xml xslt

我一直在尝试找到一个解决方案来汇总两个或更多**UUID**个变量(十六进制 XSLT2.0

假设我们有例如:

005eb9ed-1347-4ca3-bb29-9bc0db64e1ab

f5276600-a2b6-4ff6-a90e-b31fe19dae41

7d35fb7c-da5b-4830-b598-4f347a04dceb

我想将这些数字相加(视为一个数字)或者让它们将它们转换为数字然后求和它们并再次将结果更改为十六进制。

如何通过 XSLT2.0 实现这一目标?

<?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:f="http://java.sun.com/jsf/core" 
xmlns:fn="http://www.w3.org/2005/xpath-functions" 
xmlns:bin="http://expath.org/ns/binary">

<xsl:function name="f:toInt" as="xs:integer">
  <xsl:param name="uuid" as="xs:string"/>
  <xsl:variable name="b64Input" as="bin:hex(translate($uuid, '-', ''))"/>
  <xsl:sequence select="bin:unpack-unsigned-integer($b64Input, 0, bin:length($b64Input))"/>
</xsl:function>
<xsl:template match="/">
<xsl:value-of select="f:toInt(uuid['7c637c0c-7703-4389-ba52-02997a055bd7']) + f:toInt(uuid['f5276600-a2b6-4ff6-a90e-b31fe19dae41'])"/>
</xsl:template>
</xsl:stylesheet>

使用示例xslt代码更新

1 个答案:

答案 0 :(得分:1)

在EXPath二进制库的帮助下,假设一个实现支持足够大小的xs:integer值,你可以将值转换为这样的数字:

<xsl:function name="f:toInt" as="xs:integer">
  <xsl:param name="uuid" as="xs:string"/>
  <xsl:variable name="b64Input" select="bin:hex(translate($uuid, '-', ''))"/>
  <xsl:sequence select="bin:unpack-unsigned-integer(
                          $b64input, 0, bin:length($b64input))"/>
</xsl:function>

然后添加两个值:

f:toInt(uuid[1]) + f:toInt(uuid[2])