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
相关产品推荐
相关产品推荐

