我尝试使用一些静态和动态行组合为输入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>
我需要在每个&#34;数据&#34;之后添加三个固定记录。循环中的标记,但序列号应该是连续的,只考虑&#34; line&#34;序列的标签。
必需的输出文本文件:
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,我无法连续为所有行生成序列号。请帮助我找到它背后的逻辑。
答案 0 :(得分:0)
这个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 '), ., '
')"/>
</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 '), ., '
')"/>
<xsl:value-of select="concat(format-number($pos+1, '00000 '), 'static1', '
')"/>
<xsl:value-of select="concat(format-number($pos+2, '00000 '), 'static2', '
')"/>
<xsl:value-of select="concat(format-number($pos+3, '00000 '), 'static3', '
')"/>
</xsl:template>
</xsl:stylesheet>