2015-06-23 2 views
0

Я пытаюсь создать порядковый номер для моего ввода xml с некоторой комбинацией статических и динамических строк.Номер последовательности для статических и динамических строк в XSLT 2.0

ввод XML: (Edited)

<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> 

мне нужно добавить три фиксированных записей после каждого «данных» метки в петле, но порядковым номером должен быть непрерывным и рассматривать только «линейные» метки для последовательности.

Обязательный выходной текстовый файл:

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

бы это сделать 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> 
+0

Привет, спасибо за решение, я точно редактировать входной XML, так как ур решение зацикливается все другие теги также и генерируя порядковый номер для них. но мне нужно учитывать только теги «line». – subbu

+0

@subbu Проверьте измененный ответ. –

+0

Теперь его работы прекрасны. Большое спасибо – subbu

Смежные вопросы