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 '), ., '
')"/>
</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>
我正在尝试使用一些静态和动态行组合为我的输入 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 '), ., '
')"/>
</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>