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

XSLT 3.0转XSLT 2.0等价表达式问题:<xsl:copy select=".."/>编译报错

解决XSLT 2.0中替代<xsl:copy select=".."/>的问题

原XSLT 3.0代码中的<xsl:copy select=".."/>编译报错,核心原因是XSLT 2.0的<xsl:copy>元素不支持select属性——该属性是XSLT 3.0新增特性,用于指定要复制的目标节点;而2.0版本中,<xsl:copy>仅能复制当前上下文节点,无法通过select指定其他节点。

要实现原代码的功能(将TratEqnt下的Sl节点每4个一组,每组生成一个保留原节点非Sl内容的TratEqnt副本),可以使用以下XSLT 2.0等价代码:

<xsl:template match="TratEqnt">
  <!-- 保存当前匹配的TratEqnt节点,避免分组内上下文混淆 -->
  <xsl:variable name="originalTratEqnt" select="."/>
  
  <xsl:for-each-group select="Sl" group-adjacent="(position() - 1) idiv 4">
    <!-- 复制TratEqnt节点本身 -->
    <xsl:copy>
      <!-- 复制原TratEqnt的所有属性 -->
      <xsl:copy-of select="$originalTratEqnt/@*"/>
      <!-- 复制原TratEqnt除Sl外的所有子节点 -->
      <xsl:copy-of select="$originalTratEqnt/* except $originalTratEqnt/Sl"/>
      <!-- 复制当前分组的Sl节点 -->
      <xsl:copy-of select="current-group()"/>
    </xsl:copy>
  </xsl:for-each-group>
</xsl:template>

代码说明:

  • 通过变量originalTratEqnt提前保存当前匹配的TratEqnt节点,确保在for-each-group内部能稳定引用原节点(分组内上下文为Sl节点,直接用../也能获取父节点,但变量写法更清晰,避免上下文变化导致的逻辑错误)
  • 每个分组生成新的TratEqnt副本时,完整复刻原节点的属性、非Sl子节点,再替换为当前分组的Sl节点,完全对齐原XSLT 3.0代码的功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:40:36