基于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() <= 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>
关键修改说明
- 分组键定义:使用
<xsl:key>按VAR字段值对Record进行分组,确保同一VAR的记录被归为一组 - 分组内序号计算:在Record/POSN的模板中,通过
count(key('recordByVAR', ../VAR)[position() <= current()/../position()])获取当前记录在同VAR组内的位置,加上8000得到目标序列号 - Child字段同步:直接引用父Record的POSN值,实现序列号的复制同步
内容的提问来源于stack exchange,提问作者Padd T
相关产品推荐
相关产品推荐

