XSLT 2.0 中静态和动态行的序列号

Sequence number for static and dynamic rows in XSLT 2.0

我正在尝试使用一些静态和动态行组合为我的输入 xml 生成序列号。

输入xml:(已编辑)

<data>
  <oldLine>dat1</oldLine>
  <modLine>dat2</modLine>
  <line>para1</line>
  <line>para2</line>
  <line>para3</line>
</data>
<data>
   <oldLine>dat3</oldLine>
   <modLine>dat4</modLine>
   <line>para4</line>
   <line>para5</line>
</data>

我需要在循环中的每个 "data" 标签后添加三个固定记录,但序列号应该是连续的,并且只考虑 "line" 标签作为序列。

所需的输出文本文件:

00001 para1
00002 para2
00003 para3
00004 static1
00005 static2
00006 static3
00007 para4
00008 para5
00009 static1
00010 static2
00011 static3

我在我的 xsl 中试过:

<xsl:for-each select="data">
   <xsl:for-each select="line">
     <xsl:value-of select="format-number(position(),"00000")"/>
     <xsl:value-of select="."/>
     <xsl:text>%#x0A</xsl:text>
   </xsl:for-each>
   <xsl:value-of select="format-number(position(),"00000")"/>
   <xsl:text>static1</xsl:text>
   <xsl:text>%#x0A</xsl:text>
   <xsl:value-of select="format-number(position(),"00000")"/>
   <xsl:text>static2</xsl:text>
   <xsl:text>%#x0A</xsl:text>
   <xsl:value-of select="format-number(position(),"00000")"/>
   <xsl:text>static3</xsl:text>
   <xsl:text>%#x0A</xsl:text>
</xsl:for-each>

但是根据我的 xsl,我无法为所有行连续生成序列号。请帮助我找到它背后的逻辑。

这个 XSLT 会做:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*">
        <xsl:apply-templates select=".//line"/>
    </xsl:template>

    <xsl:template match="line">
        <xsl:variable name="pos" select="position() + (3 * count(preceding::data))"/>
        <xsl:value-of select="concat(format-number($pos, '00000 '), ., '&#xa;')"/>
    </xsl:template>

    <xsl:template match="data/line[last()]">
        <xsl:variable name="pos" select="position() + (3 * count(preceding::data))"/>
        <xsl:value-of select="concat(format-number($pos, '00000 '), ., '&#xa;')"/>
        <xsl:value-of select="concat(format-number($pos+1, '00000 '), 'static1', '&#xa;')"/>
        <xsl:value-of select="concat(format-number($pos+2, '00000 '), 'static2', '&#xa;')"/>
        <xsl:value-of select="concat(format-number($pos+3, '00000 '), 'static3', '&#xa;')"/>
    </xsl:template>

</xsl:stylesheet>