You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT 3.0中能否跨模板复用生成的随机UUID值?

跨模板复用生成的UUID:XSLT 3.0 & 2.0解决方案

当然可以实现!针对你的场景——替换重复的PERSON节点ID,同时在另一个模板复用这些UUID关联PROPERTIES——XSLT 3.0会提供更简洁的原生支持,XSLT 2.0也能通过一些技巧达成目标,下面分别说明:

XSLT 3.0 实现方案(优先推荐)

XSLT 3.0的动态全局变量和xsl:map特性完美解决了跨模板复用动态生成值的问题,步骤如下:

  1. 预先生成全局UUID映射
    定义一个全局变量,遍历所有PERSON节点,为每个唯一的原ID生成一次UUID并存储到map中(键为原ID,值为UUID)。XSLT 3.0允许全局变量基于文档内容动态计算,这个map可以被所有模板直接访问:

    <xsl:variable name="uuid-map" as="map(xs:string, xs:string)">
      <xsl:map>
        <xsl:for-each-group select="//PERSON" group-by="@id">
          <xsl:map-entry 
            key="current-grouping-key()" 
            select="java:java.util.UUID.randomUUID()/string()" />
        </xsl:for-each-group>
      </xsl:map>
    </xsl:variable>
    
  2. 在替换ID的模板中复用
    处理PERSON节点的ID属性时,直接从map中获取对应UUID替换原ID:

    <xsl:template match="PERSON/@id">
      <xsl:attribute name="id" select="$uuid-map(.)"/>
    </xsl:template>
    
  3. 在关联PROPERTIES的模板中复用
    处理PROPERTIES时,通过原关联ID(假设PROPERTIES有person-id属性指向PERSON原ID)从map中获取UUID,完成关联:

    <xsl:template match="PROPERTIES">
      <xsl:copy>
        <xsl:attribute name="linked-person-id" select="$uuid-map(@person-id)"/>
        <!-- 处理PROPERTIES的其他内容 -->
      </xsl:copy>
    </xsl:template>
    

如果你处理的是超大文档,XSLT 3.0的xsl:accumulator也是不错的选择——它可以在流式遍历文档的过程中积累UUID映射,避免一次性加载整个文档到内存,同样支持跨模板访问。

XSLT 2.0 实现方案

XSLT 2.0的全局变量是静态绑定的,不能直接动态生成map,但可以通过预处理生成节点集映射的方式绕开这个限制:

  1. 预先生成全局映射节点集
    定义一个全局变量,调用模板生成包含原ID和对应UUID的映射节点,再通过key()函数快速查找:

    <!-- 定义键,方便后续查找映射 -->
    <xsl:key name="id-to-uuid" match="mapping" use="@old-id"/>
    
    <xsl:variable name="uuid-mappings">
      <xsl:for-each-group select="//PERSON" group-by="@id">
        <mapping 
          old-id="{current-grouping-key()}" 
          new-id="{java:java.util.UUID.randomUUID()}" />
      </xsl:for-each-group>
    </xsl:variable>
    
    <!-- 将节点集转换为可查询的节点序列(部分处理器可能需要用节点集扩展,比如Saxon的`saxon:node-set`) -->
    <xsl:variable name="uuid-mappings-set" select="$uuid-mappings/mapping"/>
    
  2. 跨模板复用映射
    在替换ID和关联PROPERTIES的模板中,通过key()函数获取对应的UUID:

    <!-- 替换PERSON的ID -->
    <xsl:template match="PERSON/@id">
      <xsl:attribute name="id" select="key('id-to-uuid', ., $uuid-mappings-set)/@new-id"/>
    </xsl:template>
    
    <!-- 关联PROPERTIES -->
    <xsl:template match="PROPERTIES">
      <xsl:copy>
        <xsl:attribute name="linked-person-id" select="key('id-to-uuid', @person-id, $uuid-mappings-set)/@new-id"/>
        <!-- 处理PROPERTIES的其他内容 -->
      </xsl:copy>
    </xsl:template>
    

注意:XSLT 2.0调用Java类生成UUID需要确保你的处理器支持扩展(比如Saxon),并且配置了正确的类路径。

不管用哪个版本,核心思路都是提前生成一次原ID到UUID的映射并全局存储,这样所有模板都能复用同一个UUID,避免重复生成导致的不一致问题。

内容的提问来源于stack exchange,提问作者Sojimanatsu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:56:44