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

基于VAR字段值重新分配序列号的XSLT实现请求

修正XSLT实现按VAR分组分配POSN序列号

需求回顾

  • 仅对/MainHeader/Record中VAR字段值相同的记录分组,从8001开始连续分配POSN序列号
  • 若Record下包含Child段,需将该Record的POSN值同步到Child内的POSN字段
  • 当前XSLT会为所有Record生成全局连续序列号,不符合分组要求

输入XML示例

<MainHeader>
  <Record>
    <VAR>ABC</VAR>
    <POSN>1001</POSN>
    <Child>
      <POSN>2001</POSN>
    </Child>
  </Record>
  <Record>
    <VAR>ABC</VAR>
    <POSN>1002</POSN>
    <Child>
      <POSN>2002</POSN>
    </Child>
  </Record>
  <Record>
    <VAR>DEF</VAR>
    <POSN>1003</POSN>
  </Record>
</MainHeader>

期望输出XML示例

<MainHeader>
  <Record>
    <VAR>ABC</VAR>
    <POSN>8001</POSN>
    <Child>
      <POSN>8001</POSN>
    </Child>
  </Record>
  <Record>
    <VAR>ABC</VAR>
    <POSN>8002</POSN>
    <Child>
      <POSN>8002</POSN>
    </Child>
  </Record>
  <Record>
    <VAR>DEF</VAR>
    <POSN>8001</POSN>
  </Record>
</MainHeader>

当前问题XSLT示例

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Record/POSN">
    <POSN>
      <xsl:value-of select="8000 + position()"/>
    </POSN>
  </xsl:template>
</xsl:stylesheet>

修正后的XSLT代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 按VAR值分组,定义键 -->
  <xsl:key name="recordByVAR" match="Record" use="VAR"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 处理Record的POSN:按VAR分组计算序号 -->
  <xsl:template match="Record/POSN">
    <POSN>
      <xsl:value-of select="8000 + count(key('recordByVAR', ../VAR)[position() &lt;= current()/../position()])"/>
    </POSN>
  </xsl:template>

  <!-- 处理Child的POSN:继承父Record的POSN值 -->
  <xsl:template match="Child/POSN">
    <POSN>
      <xsl:value-of select="../../POSN"/>
    </POSN>
  </xsl:template>
</xsl:stylesheet>

关键修改说明

  1. 分组键定义:使用<xsl:key>按VAR字段值对Record进行分组,确保同一VAR的记录被归为一组
  2. 分组内序号计算:在Record/POSN的模板中,通过count(key('recordByVAR', ../VAR)[position() &lt;= current()/../position()])获取当前记录在同VAR组内的位置,加上8000得到目标序列号
  3. Child字段同步:直接引用父Record的POSN值,实现序列号的复制同步

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:42:14